试设计一算 法:输入字符串 S,以‘!’为结束标志,如果串 S 中不存在等值子串,则输出信息:” 无等值子串”,否则求出(输出)一个长度最大的等值子串。
时间: 2023-12-10 08:39:25 浏览: 59
可以使用哈希表来解决这个问题。具体算法如下:
1. 定义一个空的哈希表,用于存储每个字符出现的最后位置。
2. 从字符串的开头开始遍历,对于每个字符,如果它在哈希表中不存在,则将其添加到哈希表中,并记录它的位置。
3. 如果该字符在哈希表中已经存在,则说明存在等值子串,将其起始位置和长度记录下来。
4. 遍历完整个字符串后,如果没有找到等值子串,则输出”无等值子串”。
5. 如果找到了等值子串,则输出长度最大的等值子串。
代码实现如下:
```
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int main() {
string s;
unordered_map<char, int> pos;
int max_len = 0, start = 0;
getline(cin, s, '!');
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (pos.find(c) == pos.end()) {
pos[c] = i;
} else {
int len = i - pos[c];
if (len > max_len) {
max_len = len;
start = pos[c];
}
}
}
if (max_len == 0) {
cout << "无等值子串" << endl;
} else {
cout << "最长等值子串: " << s.substr(start, max_len) << endl;
}
return 0;
}
```
阅读全文