用Qt可视化无重复字符的最长子串
时间: 2023-10-29 13:14:23 浏览: 71
以下是一个使用Qt可视化的无重复字符的最长子串解决方案:
1. 创建一个Qt窗口,其中包含一个文本框和一个按钮。
2. 当用户点击按钮时,获取文本框中的输入字符串。
3. 创建一个空字符串来存储最长的无重复字符子串,并创建一个空的字符集来存储当前子串中的字符。
4. 遍历输入字符串的每个字符,如果该字符不在字符集中,则将其添加到字符集和当前子串中。
5. 如果该字符已经在字符集中,则从当前子串的开头开始删除字符,直到该字符不再存在于字符集中为止。
6. 如果当前子串的长度大于最长子串的长度,则更新最长子串。
7. 将最长子串显示在文本框中。
下面是一个示例代码:
mainwindow.h
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
```
mainwindow.cpp
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <unordered_set>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString input = ui->lineEdit->text();
std::string inputStr = input.toStdString();
std::string longestSubstr = "";
std::unordered_set<char> charSet;
std::string currentSubstr = "";
for (int i = 0; i < inputStr.length(); i++) {
char c = inputStr[i];
if (charSet.find(c) == charSet.end()) {
charSet.insert(c);
currentSubstr += c;
} else {
while (currentSubstr[0] != c) {
charSet.erase(currentSubstr[0]);
currentSubstr.erase(0, 1);
}
currentSubstr.erase(0, 1);
currentSubstr += c;
}
if (currentSubstr.length() > longestSubstr.length()) {
longestSubstr = currentSubstr;
}
}
QString result = QString::fromStdString(longestSubstr);
ui->lineEdit_2->setText(result);
}
```
在这个示例中,我们使用了一个无序集合来存储当前子串中的字符,这样我们可以快速检查一个字符是否已经存在于当前子串中。在遍历输入字符串的每个字符时,如果该字符不在字符集中,则将其添加到字符集和当前子串中。如果该字符已经在字符集中,则从当前子串的开头开始删除字符,直到该字符不再存在于字符集中为止。如果当前子串的长度大于最长子串的长度,则更新最长子串。最后,将最长子串显示在文本框中。
这是一个简单但有效的方法,可以在较短的时间内找到最长的无重复字符子串。