最长的连续相同字符的字符串和最长连续不相同字符的子字符串问题

来源:互联网 发布:正德福飞机模型淘宝 编辑:程序博客网 时间:2024/05/16 19:13

1、给定一个字符串s,获取其最长的连续相同字符的子字符串,实现代码如下

#include<iostream>#include<string>using namespace std;string longestSameCharacter(string &s){int slen = s.length();if (slen == 0){return "";}int first = 0;int len = 1;int maxfirst = 0;int maxlen = 1;int i = 1;while (i != slen){if (s[i] == s[i - 1]){len = i - first + 1;if (len > maxlen){maxfirst = first;maxlen = len;}}else{first = i;}++i;}return s.substr(maxfirst, maxlen);}int main(){string s1 = "a";string s2 = "abgakgsaksse";string s3 = "abccccccccf";string s4 = "ahiengkehkigfioaa";cout << longestSameCharacter(s1) << endl;cout << longestSameCharacter(s2) << endl;cout << longestSameCharacter(s3) << endl;cout << longestSameCharacter(s4) << endl;system("pause");return 0;}

实验结果如下所示,

1、给定一个字符串s,获取其最长的连续不相同字符的子字符串,实现代码如下

#include<iostream>#include<string>#include<vector>using namespace std;string LongestSubstring1(string &s)//哈希表法,时间复杂度O(n^2){int slen = s.length();if (slen == 0){return "";}int i, j, len;int count[256];//保存每个字符是否出现int maxfirst = 0;int maxlen = 1;for (i = 0; i != slen; ++i){fill(count, count + 256, 0);count[s[i]] = 1;for (j = i + 1; j != slen; ++j){if (count[s[j]] == 0){count[s[j]] = 1;}elsebreak;}len = j - i;if (len > maxlen){maxfirst = i;maxlen = len;}}return s.substr(maxfirst,maxlen);}string LongestSubstring(string &s)//哈希表法,时间复杂度O(n){int slen = s.length();if (slen == 0){return "";}vector<int> pos(256, -1);//记录字符的最新位置int curfirst = 0;//当前字符的计数开始位置int len = 0;//以该字符结尾的无重复字符的子串长度int maxfirst = 0;//最长无重复子串的起始位置int maxlen = 0;//最长无重复子串的长度for (int i = 0; i != slen; ++i){if (pos[s[i]] == -1){++len;}else{if (curfirst <= pos[s[i]]){len = i - pos[s[i]];curfirst = pos[s[i]] + 1;}else{++len;}}pos[s[i]] = i;if (len > maxlen){maxlen = len;maxfirst = i - maxlen + 1;}}return s.substr(maxfirst, maxlen);}int main(){string s1 = "";string s2 = "qwnfenpglqdq";string s3 = "abacd";string s4 = "ababababcdef";string s5 = "thodvabcdeineigndienhg";cout << LongestSubstring(s1) << endl;cout << LongestSubstring(s2) << endl;cout << LongestSubstring(s3) << endl;cout << LongestSubstring(s4) << endl;cout << LongestSubstring(s5) << endl;system("pause");return 0;}
代码已通过leetcode平台验证,实验结果如下所示,


0 0