1.求最长回文子串
使用动态规划
状态:如果s[i+1]…s[j-1]是回文串,而且s[i]=s[j],那么s[i]…s[j]也是回文串
所以状态转移数组dp[i] [j]表示s[i…j]是否是一个回文串
class Solution {
public:
string longestPalindrome(string s) {
if(s.size()<=1) return s;
bool dp[s.size()][s.size()];//dp数组
int maxlen=1;
int start=0;
for(int j=1;j<s.size();j++){
for(int i=0;i<j;i++){//从s[0..1]开始
if(s[i]!=s[j]) dp[i][j]=false;
else if(j-i<3||dp[i+1][j-1]) dp[i][j]=true;
//j-i<3的意思是,如果s[i]=s[j]而且i和j之间只有0个或1个字符,那么s[i..j]是回文串
else dp[i][j]=false;
if(dp[i][j]&&j-i+1>maxlen){
maxlen=j-i+1;
start=i;
}
}
}
return s.substr(start,maxlen);
}
};
使用中心扩散法
枚举每一个字符作为中心点,用双指针向两边扩散,来搜索到以该字符为中心的最长回文串
string centerSpread(string s, int left, int right) {
int size = s.size();
int i = left;
int j = right;//左右起点,应枚举所有i=j和j=i+1的情况,来对应最终是奇数还是偶数
while (i >= 0 && j < size) {
if (s[i] == s[j]) {
i--;j++;
} else {
break;
}
}
return s.substr(i + 1, j - i - 1);
}
2.求回文子串的个数
使用上面的中心扩散法,每成功扩散一次,则找到一个回文子串
class Solution {
public:
int countSubstrings(string s) {
if(s.size()<=1) return s.size();
int ans=0;
int len=s.size();
int l,r;
for(int i=0;i<len;i++){
for(int j=i;j<=i+1;j++){
l=i;
r=j;
while(l>=0&&r<len&&s[l--]==s[r++]) ans++;
}
}
return ans;
}
};
3.to_string
std::to_string
vector<int> nums={1,2,3,4,5};
vector<string> numstring;
for(auto x:nums)
numstring.push_back(to_string(x));