C++程式:查詢既是字首又是字尾的最長子串
假設我們有一個字串s,我們需要找到s的最長字首,該字首也是s的字尾(不包括自身)。如果沒有這樣的字首,則返回空字串。
例如,如果輸入是"madam",則輸出為"m"。它有4個(不包括自身)字首:"m","ma","mad","mada",以及4個字尾:"m","am","dam","adam"。最長的既是字首又是字尾的子串是"m"。
為了解決這個問題,我們將遵循以下步驟:
定義一個函式lps(),它將接收s作為引數。
n := s的長度
定義一個大小為n的陣列ret
j := 0, i := 1
當i < n時,執行:
如果s[i]等於s[j],則:
ret[i] := j + 1
(i加1)
(j加1)
否則,如果s[i]不等於s[j],則:
如果j > 0,則:
j := ret[j − 1]
否則
(i加1)
返回ret
在主方法中執行以下操作:
n := s的長度
如果n等於1,則:
返回空字串
定義一個數組v = lps(s)
x := v[n − 1]
ret := 空字串
從i := 0開始,當i < x時,重複執行(i加1):
ret := ret + s[i]
返回ret
讓我們來看下面的實現來更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector <int> lps(string s){
int n = s.size();
vector<int> ret(n);
int j = 0;
int i = 1;
while (i < n) {
if (s[i] == s[j]) {
ret[i] = j + 1;
i++;
j++;
}
else if (s[i] != s[j]) {
if (j > 0)
j = ret[j - 1];
else {
i++;
}
}
}
return ret;
}
string longestPrefix(string s) {
int n = s.size();
if (n == 1)
return "";
vector<int> v = lps(s);
int x = v[n - 1];
string ret = "";
for (int i = 0; i < x; i++) {
ret += s[i];
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.longestPrefix("helloworldhello"));
}輸入
"helloworldhello"
輸出
hello
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP