程序以查找最长前缀,该前缀也是C ++中的后缀
假设我们有一个字符串s,我们必须找到s的最长前缀,它也是一个后缀(不包括其自身)。如果没有这样的前缀,则只需返回空白字符串。
因此,如果输入像“女士”,那么输出将是“m”,它有4个前缀(不包括自身)。它们是“m”,“ma”,“mad”,“mada”和4个后缀,例如“m”,“am”,“dam”,“adam”。后缀的最大前缀由“m”给出。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数lps(),需要s,
n:=s的大小
定义大小为n的数组ret
j:=0,i:=1
当我<n时,-
如果j>0,则-
除此以外
j:=ret[j−1]
(将i增加1)
ret[i]:=j+1
(将i增加1)
(将j增加1)
如果s[i]与s[j]相同,则-
否则,当s[i]不等于s[j]时,则-
返回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