求无重复字符排序后的最长子序列的c++程序
时间: 2024-10-01 08:02:48 浏览: 26
dbx.rar_dbx_最长子序列
在C++中,我们可以使用动态规划的方式来解决这个问题。这里是一个简单的示例程序,用于找到无重复字符的最长子序列并按字典序排序:
```cpp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
std::string findPassword(std::string input) {
int n = input.size();
std::vector<int> dp(n, 0);
std::vector<std::pair<char, int>> pos;
for (int i = 0; i < n; ++i) {
if (pos.empty() || pos.back().first != input[i]) {
pos.push_back({input[i], i});
} else {
dp[i] = pos.back().second + 1;
pos.pop_back();
}
while (!pos.empty() && pos.front().second < i - dp[i]) {
pos.pop_front();
}
if (pos.empty()) {
dp[i] += 1;
} else {
dp[i] = std::max(dp[i], pos.front().second + 1);
}
pos.push_front({input[i], i});
}
std::string password;
for (int i = dp.argmax(); i >= 0; --i) {
password += input[i];
}
std::sort(password.begin(), password.end());
return password;
}
int main() {
std::string input;
std::cout << "请输入原始字符串: ";
std::cin >> input;
std::string result = findPassword(input);
std::cout << "生成的密码: " << result << std::endl;
return 0;
}
```
在这个程序中,`dp`数组记录每个位置之前未重复字符所能构成的最长子序列长度,`pos`存储当前遍历过程中遇到的新字符及其索引。程序首先初始化,然后逐个字符检查,更新`dp`和`pos`,最后将结果字符串排序返回。
运行此程序时,只需输入一个字符串,它会输出经过处理后的密码。
阅读全文