最近研究没什么进展。。无聊去刷刷leetcode
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
题目的意思很简单,就是找到最大的回文字符串就可以了,也不用统计长度之类的。
这个题目不难,样例中也提示了需要分类。
我采取的算法比较简单粗暴,简单来说就是,从该字符串中的某个字符开始,向两端进行搜索。首先在出发点设置2个标记,left和right,然后去搜索,直到left和right对应的字符不匹配,设置一个全局的maxleft标签,每次搜索记录下长度,如果找到了更长的字符串,就把maxleft的位置更新,长度也更新,最后从maxleft开始把该长度的字符串输出就可以了。
具体c++代码如下所示:
#include <iostream>
#include <string>
using namespace std;
int maxleft = 0;
int maxlength = 0;
void find_two_side(int &left,int &right,string s)
{
while (left > 0 && right < s.length() - 1 && s[left - 1] == s[right + 1]) {
left--;
right++;
}
}
int main()
{
string s;
cin >> s;
if (s.length() <= 1) {
cout << s;
}
if (s.length() == 2 && s[0] == s[1]) {
cout << s;
}
int left = 0;
int right = 0;
for (int i = 0; i < s.length(); i++) {
//第一种情况,中间只有一个字符
left = right = i;
find_two_side(left, right, s);
if (right - left + 1 > maxlength) {
maxlength = right - left + 1;
maxleft = left;
}
//第二种情况,中间有两个字符
left = i;
right = i + 1;
if (s[left] == s[right]) {
find_two_side(left, right, s);
if (right - left + 1 > maxlength) {
maxlength = right - left + 1;
maxleft = left;
}
}
}
for (int i = maxleft; i <= maxlength; i++) {
cout << s[i];
}
return 0;
}
当然这在leetcode肯定过不了的。。因为leetcode你需要把他转化成他要求答题的形式。。。
这个题目确实比较简单。。emm,也算是入门了吧3333