substr()函数,字符串截取函数,从下表i开始,截取到长度为n的字符串。形式s.substr(i,n);
例题为力扣最长回文子串问题,题号为5.
class Solution { public: string longestPalindrome(string s) { if(s.size()<=0) return ""; int maxs=1; string result=""; result+=s[0]; for(int i=1;i<s.size();i++) { //首先看看有没有可能作为中点回文,奇数 int j=i-1; int k=i+1; while(j>=0 && k<s.size() && s[j]==s[k]) { j--; k++; } if(maxs<k-j-1) { maxs=k-j-1; result=s.substr(j+1,maxs); } //然后来看看有没有成为偶数回文串的可能,偶数,取其为中间靠右的开始 j=i-1; k=i; while(j>=0 && k<s.size() && s[j]==s[k]) { j--; k++; } if(maxs<k-j-1) { maxs=k-j-1; result=s.substr(j+1,maxs); } } return result; } };
方法改进,我们为什么要将字符串的复制截取放到每一个语句循环中间呢,我们完全可以将其最后才复制,每次只需要记录一下下标即可
string longestPalindrome(string s) { if(s.size()<=0) return ""; else if(s.size()==1) { string r=""; r+=s[0]; return r; } int maxs=1; string result=""; result+=s[0]; int Index; for(int i=1;i<s.size();i++) { //首先看看有没有可能作为中点回文,奇数 int j=i-1; int k=i+1; while(j>=0 && k<s.size() && s[j]==s[k]) { j--; k++; } if(maxs<k-j-1) { maxs=k-j-1; Index=j+1; } //然后来看看有没有成为偶数回文串的可能,偶数,取其为中间靠右的开始 j=i-1; k=i; while(j>=0 && k<s.size() && s[j]==s[k]) { j--; k++; } if(maxs<k-j-1) { maxs=k-j-1; Index=j+1; } } result=s.substr(Index,maxs); return result; }