一、最长回文子串
fabad中aba符合条件
fabbad中abba也是
在这里介绍使用扩散法判断回文
比如 acbc;
i为1从c开始,开始往左右两边扩散,left = i-1,right = i+1,判断是否相等,这里不相等,继续i来到b位置,left=i-1,right=i+1这是left和right对应元素是相等的,所以继续扩散,直到不满足条件了那么拷贝left到right中间的字符即可。
注意:刚才只是考虑到奇回文,对于偶回文可以将偶回文转换为奇回文,如将abba变成a#b#b#a
#include<iostream>
#include<string>
using namespace std;
class Solution {
private:
string process(string str, int index) {
string temp_str = to_string(str[index]);
int left = index - 1;
int right = index + 1;
while (left >= 0 && right < str.size() && str[left] == str[right]) {
temp_str = str.substr(left, right - left + 1);//如果满足条件在里面更新temp_str;
left--;
right++;
}
return temp_str;
}
public:
string get_max_huiwen(string input_str) {
if (input_str.size() == 1)
return input_str;
//将输入增加“#”兼容奇偶回文
string str = "";
for (int i = 0; i < input_str.size(); ++i) {
str+= input_str[i];
if (i != input_str.size() - 1)
str += '#';
}
string res_str = "";//记录最长的回文串
for (int i = 1; i < str.size(); ++i) {
string temp_str = process(str,i);
res_str = res_str.size() > temp_str.size() ? res_str : temp_str;
}
//最后去除“#”取出最后的结果
string res = "";
for (int i = 0; i < res_str.size(); ++i) {
if (res_str[i] != '#')
res += res_str[i];
}
return res;
}
};
int main() {
string input_str;
while (cin >> input_str) {
Solution* ptr = new Solution();
string res = ptr->get_max_huiwen(input_str);
cout << res << endl;
}
}
2、分别考虑奇偶回文 ,菜鸟级别代码[捂脸]
#include<iostream>
#include<string>
using namespace std;
class Solution {
private:
string process(string str,string str_mid,int left,int right) {
while (left >= 0 && right < str.size() && str[left] == str[right]) {
str_mid = str.substr(left, right - left + 1);//如果满足条件在里面更新temp_str;
left--;
right++;
}
return str_mid;
}
string max4(string res_str,string str1, string str2, string str3) {
string res = res_str.size() >= str1.size() ? res_str : str1;
res = res.size() >= str1.size() ? res : str1;
res = res.size() >= str2.size() ? res : str2;
return res.size() >= str3.size() ? res : str3;
}
public:
string get_max_huiwen(string input_str) {
if (input_str.size() == 1)
return input_str;
string res_str = "";//记录最长的回文串
for (int i = 0; i < input_str.size(); ++i) {
string sub_str1 = ""; sub_str1 += input_str[i];
string sub_str2 = process(input_str,sub_str1,i - 1, i + 1);//奇回文
string sub_str3 = process(input_str,"", i, i + 1);//偶回文
res_str = max4(res_str,sub_str1, sub_str2, sub_str3);
}
return res_str;
}
};
int main() {
string input_str;
while (cin >> input_str) {
Solution* ptr = new Solution();
string res = ptr->get_max_huiwen(input_str);
cout << res << endl;
}
}
二、最长不重复的子串
如:abbcdeffg,最长的不重复为bcdef
使用unorder_map<char,int>记录当前位置出现某字符的次数,如果超过两次(即重复) 那么开始跳出循环结算
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;
class Solution {
private:
unordered_map<char, int> p;
public:
string getLongestNoRepeat(string input_str) {
if (input_str.size() == 0)
return "";
string res = "";//存放最后的结果
for (int i = 0; i < input_str.size(); ++i) {
string temp = "";
temp += input_str[i];
if (p.find(input_str[i]) == p.end())//记录当前位置次数
p[input_str[i]] = 1;
else
p[input_str[i]]++;
for (int j = i + 1; j < input_str.size(); ++j) {
if (p.find(input_str[j]) == p.end()) {//如果没有出现过,temp+=...
p[input_str[j]] = 1;
temp += input_str[j];
}
else {
p.clear();//否则清空p,跳出循环开始结算
break;
}
}
res = res.size() >= temp.size() ? res : temp;
}
return res;
}
};
int main() {
string input_str;
while (cin >> input_str) {
Solution* ptr = new Solution();
string res = ptr->getLongestNoRepeat(input_str);
cout << res << endl;
}
}