題目及要求:
給你一個字串 s,找到 s 中最長的回文子串,
提示:
1 <= s.length <= 1000
s 僅由數字和英文字母(大寫和/或小寫)組成
原創代碼:
class Solution {
public:
string longestPalindrome(string s)
{
int begin=0;//每個當前子串的開頭
int end=0;//每個當前子串的末尾
int value=0;//判斷條件使用,條件一:當形參string s不存在兩個及兩個以上元素個數的回文字串則value=1,條件二:當形參string s存在兩個及兩個以上元素個數的回文字串則value=0
int max=0;//記錄歷史回文字串的最大元素個數
string str;//代表當前回文串
string str_2=s[0];//代表最大回文串
for(begin=0;begin<=s.size()-1;begin++)
{
for(end=begin;end<=s.size()-1;end++)
{
value=0;
/*條件一:當形參string s不存在兩個及兩個以上元素個數的回文字串則value=1*/
for(int i=0;i<=(end-begin)/2;i++)
{
if(s[begin+i]!=s[end-i])
{
value=1;
break;
}
}
/*條件二:當形參string s存在兩個及兩個以上元素個數的回文字串則value=0*/
if(value==0)
{
str.erase(0,str.size());
for(int i=begin;i<=end;i++)
{
str.push_back(s[i]);
}
str_2=str.size()>max?str:str_2;
max=str.size()>max?str.size():max;
if(str_2.size()==s.size())
return str_2;
}
}
}
return str_2;
}
};
輸出示例:
示例 1:
輸入:s = “babad”
輸出:“bab”
解釋:“aba” 同樣是符合題意的答案,
示例 2:
輸入:s = “cbbd”
輸出:“bb”
示例 3:
輸入:s = “a”
輸出:“a”
示例 4:
輸入:s = “ac”
輸出:“a”
代碼思路:
首先:
定義變數,并將str_2用s[0]賦初值,用以當形參string s不存在兩個及兩個以上元素個數的回文字串則輸出形參s的首元素
int begin=0;//每個當前子串的開頭
int end=0;//每個當前子串的末尾
int value=0;//判斷下一個字符是否屬于當前子串
int max=0;//記錄歷史回文子串的最大元素個數
string str;//代表當前回文子串
string str_2=s[0];//代表最大回文子串
其次:
每一個子串(形參s元素s[begin]至s[end]之間的元素)都先判斷條件一(當前子串是否存在兩個及兩個以上元素個數的回文字串)是否滿足,若滿足條件一,則進行
value=1;
break;
則str_2的值不改變為初值s[0],接下來繼續進行回圈
end++
如果當前子串(形參s元素s[begin]至s[end]之間的元素)不滿足條件一,則由于此時
value=0;
則直接進入條件二來將str(形參s元素s[begin]至s[end]之間的元素)重新賦值(注意str表示當前的回文子串)并通過變數max來判斷當前回文子串str與歷史最大回文子串str_2的元素進行比較,如果當前回文子串str元素個數比歷史最大回文子串str_2的元素個數更大則將歷史最大回文子串str_2重新賦值
注意接下來的陳述句是用來縮小程式運行時間的
if(str_2.size()==s.size())
return str_2;
接下來繼續進行回圈
end++
最后:
當滿足begin>s.size()-1時退出程式,執行
return str_2
反思所得:
在這道題的解題程序中,我開始的時候是不明白回文的定義是什么的,但是經過代碼的不斷上傳和查看他人的講解,我明白了回文的定義(類似于“上海自來水來自海上”),了解了回文的定義我就重新修改了思路,為了簡便演算法,我開始考慮將程式分條件編程,并且在每個條件內盡量減少程式進行無用的部分,
LeetCode鏈接:
https://leetcode-cn.com/problems/longest-palindromic-substring/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/291525.html
標籤:其他
