C++中最長的快樂字首
假設我們有一個字串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("madam"));
}輸入
"madam"
輸出
m
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP