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
廣告