使用Manacher算法,写一个最长回文字串qt代码,创建界面实现输入输出
时间: 2024-02-19 18:58:27 浏览: 30
下面是一个基于 Qt 的最长回文子串的界面实现,包括输入输出和求解最长回文子串的代码:
mainwindow.h:
```cpp
#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;
QString manacher(QString s);
};
#endif // MAINWINDOW_H
```
mainwindow.cpp:
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString s = ui->lineEdit->text();
if (s.isEmpty()) {
QMessageBox::warning(this, tr("错误"), tr("请输入字符串"));
return;
}
QString ans = manacher(s);
ui->textEdit->setText(ans);
}
QString MainWindow::manacher(QString s)
{
QString ss = "#";
for (int i = 0; i < s.length(); i++) {
ss += s[i];
ss += "#";
}
int len = ss.length();
int maxRight = 0, center = 0;
QVector<int> p(len, 0);
int maxLen = 0, start = 0;
for (int i = 0; i < len; i++) {
if (i < maxRight) {
p[i] = qMin(p[2 * center - i], maxRight - i);
}
else {
p[i] = 1;
}
while (i - p[i] >= 0 && i + p[i] < len && ss[i - p[i]] == ss[i + p[i]]) {
p[i]++;
}
if (i + p[i] > maxRight) {
maxRight = i + p[i];
center = i;
}
if (p[i] > maxLen) {
maxLen = p[i];
start = (i - maxLen) / 2;
}
}
return s.mid(start, maxLen - 1);
}
```
mainwindow.ui:
在 Qt Designer 中创建界面,添加一个 QLineEdit 和一个 QPushButton 和一个 QTextEdit,并将其分别命名为 lineEdit、pushButton 和 textEdit。
最后,将 pushButton 的 clicked 信号与 on_pushButton_clicked() 槽函数连接起来,并在 MainWindow 的构造函数中添加以下代码:`ui->textEdit->setReadOnly(true);`,以使 textEdit 只读。
这样,就完成了一个基于 Qt 的最长回文子串求解界面。
在界面中输入待求解的字符串,点击按钮,即可在 textEdit 中显示其最长回文子串。如果输入为空,则会弹出错误提示框。