「Happy Prefix」は、元の文字列の空ではない接頭辞と接尾辞(元の文字列自体を除く)の両方である文字列です。
文字列sを指定してください。最長のハッピープレフィックスを返してください。
タイトルを満たす接頭辞がない場合、空の文字列が返されます。
例1:
入力:s = "level"
出力: "l"
説明:s自体を除いて、4つのプレフィックス( "l"、 "le"、 "lev"、 "leve")と4つのサフィックス( "l"、 「el」、「vel」、「evel」)。プレフィックスとサフィックスの両方を含む最長の文字列は "l"です。
例2:
入力:s = "ababab"
出力: "abab"
説明: "abab"は、接頭辞と接尾辞の両方である最も長い文字列です。タイトルを使用すると、元の文字列でプレフィックスとサフィックスを重複させることができます。
例3:
入力:s = "leetcodeleet"
出力: "leet"
例4:
入力:s = "a"
出力: ""
ヒント:
1 <= s.length <= 10 ^ 5
sには小文字の英字のみが含まれます
出典:LeetCode
リンク:https ://leetcode-cn.com/problems/longest-happy-prefix
著作権は控除ネットワークに属しています。商用転載の正式な許可書に連絡し、非商用転載の出典を明記してください。
最初のアイデア:
暴力が解決した後、私はそれを試しましたが、私はそれを渡すことができました!
時間の複雑さ:O(N ^ 2)
スペースの複雑さ:O(N)
class Solution(object):
def longestPrefix(self, s):
"""
:type s: str
:rtype: str
"""
res = ""
for i in range(len(s) -1, -1, -1):
if s[:i] == s[-i:]:
res = s[:i]
break
return res if res != s else ""
2番目のアイデア:
文字列ハッシュのアルゴリズム、
各文字列をPシステムの数値に変換し、Mを法としてハッシュ値を計算します。
PとMの適切な値を通じて、各文字列とハッシュ値は可能な限り互いに対応する必要があるため、数値を比較するたびに、文字列がO(1)時間で同じであるかどうかを確認できます。
ここでP = 131およびM = 10 ** 9 + 7。
1.接頭辞の値を計算するために、
s [:i]のハッシュ値がh(i)であるとすると、s [:i + 1]のハッシュ値はh(i + 1)=(h(i)* P + s [i])%です。 M、
10進法と同様に、現在の数値は56で、右端に新しい3が追加され、結果は(56 * 10 + 3)%10 = 563になります。
2. suffixの値を計算するために、ベースの新しい最も高い倍数を記録するために追加の変数倍数が必要です
suffix_new =(新しい文字*複数+ suffix_old)%M、
10進法と同様に、現在の数値は34で、新しい2が左端に追加されます。新しい2は100桁に対応することがわかっています。
したがって、結果は(2 * 100 + 34)%10 = 234です。
時間の複雑さ:O(N)
スペースの複雑さ:O(1)
class Solution(object):
def longestPrefix(self, s):
"""
:type s: str
:rtype: str
"""
base = 131
mod = 10 ** 9 + 7
res = ""
prefix, suffix = 0, 0
multiple = 1
for i in range(len(s) - 1):
prefix = (prefix * base + ord(s[i])) % mod
suffix = (ord(s[-(i + 1)]) * multiple + suffix) % mod
if prefix == suffix:
res = s[:i + 1]
multiple = multiple * base % mod
return res