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

更新於:2020年6月9日

878 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告