返回最长子回文子串和最长不重复的子串

一、最长回文子串

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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无情的搬砖机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值