leetcode_459(重複子串模式)
一、題目大意
給定一個非空字串,判斷它是否可以通過自身的子串重複若干次構成。你可以假設字串只包含小寫英文字母,並且長度不會超過10000
二、分析
1, kmp模式匹配演算法,這是模式匹配最快的的演算法,複雜度是O(n)。
《KMP演算法的詳解》
2,方法二:若字串的長度為len,則重複子串的長度最長為len/2,可以遞減逐一判讀是否。
3,方法三:重複子串長度最長為len/2,直接每次選擇一個可以被整除的較小的數,擷取開頭的那幾個字元,然後重複到原長度驗證就好。
三,java實現2,3
1,方法二
public static boolean repeatedSubstringPattern(String str ) {
int len = str.length();
int i = 1;
boolean flag = false;
while(i<=len/2) {//逐一判斷
if(len % i == 0) {
flag = check(str,i);//當前長度可不可得到重複子串
}
i++;
if(flag) break;
}
return flag;
}
public static boolean check(String str,int distance) {//方法具體實現
int len = str.length();
for(int i=0;i<distance;i++) {
for(int j=i+distance;j<len;j += distance) {
if(str.charAt(i) != str.charAt(j))
return false;
}
}
return true;
}
2,方法三
public static boolean repeatedSubstringPattern2(String str) {
int len = str.length();
for(int i=1;i<=len/2;i++) {//最大長度
if(len%i == 0) {
String tem = str.substring(0, i);//子串
StringBuffer sb = new StringBuffer();
for(int j=0;j<len/i;j++) {
sb = sb.append(tem);//生成相同長度
}
if(sb.toString().equals(str))//驗證
return true;
}
}
return false;
}
四、python實現方法1
記字串長度為size
利用KMP演算法求next陣列,記next陣列的最後一個元素為p
若p > 0 並且 size % (size - p) == 0,返回True
next陣列具有如下性質:
str[ 0 : next[i] ] == str[ i + 1 - next[i] : i + 1 ]
例如:
a, b, c, d, a, b, c, a, b, c, d, a, b, c, d, c
0, 0, 0, 0, 1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 4, 0
class Solution(object):
def repeatedSubstringPattern(self, str):
"""
:type str: str
:rtype: bool
"""
size = len(str)
next = [0] * size
for i in range(1, size):
k = next[i - 1]
while str[i] != str[k] and k:
k = next[k - 1]
if str[i] == str[k]:
next[i] = k + 1
p = next[-1]
return p > 0 and size % (size - p) == 0
相關推薦
leetcode_459(重複子串模式)
一、題目大意 給定一個非空字串,判斷它是否可以通過自身的子串重複若干次構成。你可以假設字串只包含小寫英文字母,並且長度不會超過10000 二、分析 1, kmp模式匹配演算法,這是模式匹配最快的的演算法,複雜度是O(n)。 《KMP演算法的詳解》 2,
leetcode_459. Repeated Substring Pattern 重複子串模式,判斷某個字串能否由某個字串重複若干次組成
題目: Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring
找出字串最長不重複子串(或者是列表)
# 找出來一個字串中最長不重複子串def find_Maxlen_Son_list(astr): maxlen = 0 定義最長字串的初始長度// dict = {} list1 = [] for i in range(0,len(astr)): str2 = ''
LeetCode千題斬之3:Longest Substring Without Repeating Characters(最長不重複子串)
題目:Given a string, find the length of the longest substring without repeating characters. 先說說思路,優化的方法在於用一個滑動的視窗[i,j]瀏覽字串,先把遇到的字元加入一個字典dic
POJ-2406 Power Strings(KMP求重複子串出現的最大次數)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 50744 Accepted: 21173 Description Given two strings a an
POJ 2406 Power Strings(KMP求一個串的重複子串)
題意:給一個字串S長度不超過10^6,求最大的n使得S由n個相同的字串a連線而成,如:"ababab"則由n=3個"ab"連線而成,"aaaa"由n=4個"a"連線而成,"abcd"則由n=1個"a
計蒜客 密碼安全性進階版 (不可重疊重複子串的個數)
可以列舉子串公共字首長度進行求解 #include<stdio.h> #include<algorithm> #include<cstring> #include<iostream> const int MAXN =
求字串的最長重複子串(java)
-暴力法 兩個指標實現,複雜度O(n^2) package test; import java.util.Scanner; public class Main2 { public static String maxRepat(String str)
尋找一個字串中的最長重複子串(字尾陣列)&找出一個字串中最長不重複子串
一、尋找一個字串中的最長重複子串(字尾陣列) 字尾陣列其實可以看尋找一個字串中的最長重複子串(字尾陣列)作一個由字串s倒數i個字元組成的子串的集合,其中0<i<s.length(),例如 字串strstr的字尾陣列為: {r,tr,str,rstr,trstr,
求最大不重複子串(Java)
一個經典問題,就是求字串中不包含重複字元的最大子串。如果有多個這樣的子串,則輸出第一個。例:str=”abxacsvada”,最大不重複子串為:“bxacsv”。 我的思路其實也就是從頭比較到尾來找,只是中間加了一些判斷條件進行了優化。具體流程(先轉化成cha
LeetCode | Longest Substring Without Repeating Characters(最長連續不重複子串)
題目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without re
一般的模式匹配演算法(求子串位置)
//一般的模式匹配演算法 #include<stdio.h> int Index (char *s , char *t , int pos );//返回子串t在主串s中第pos個
3693 求這串字元中的重複次數最多的連續重複子串,多組答案輸出字典序最小的那個串(字尾陣列)
題目:求這串字元中的重複次數最多的連續重複子串,多組答案輸出字典序最小的那個串。 思路:與前一個題目幾乎一樣的,加上了字典序。多判斷就好 //#include<bits/stdc++.h> #include<iostream> #include
求最長不重複子串---LeetCode3
Longest Substring Without Repeating Characters 題目描述 Given a string, find the length of the longest substring without repeating characters. Exa
字尾陣列求最長重複子串
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
資料結構/最長重複子串
基本方法、KMP演算法求解、字尾陣列求解 求字串的最長重複子串 例如:aaaaaaaaabbbbcccaaassscvvv這裡面的最長重複子串為aaaaaaaaa 演算法思路:演算法時間複雜度(O(n)) 1. 將這一個字串先轉成char陣列; 2. 將這一char陣列進行遍歷
資料結構/最長非重複子串
給定一個字串,找字元中的最大非重複子串 基本方法、動態規劃、動態規劃+Hash 如下方法的時間複雜度O(n) list中儲存的是最終的輸出結果 public static int lengthOfLongestSubstring(String s) { if(s.length()==0){
[字尾陣列 + 二分] 求最長不重疊重複子串 POJ - 1743
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 35051
資料結構——求一個串中出現的第一個最長重複子串
求一個串中出現的第一個最長重複子串。 輸入串:36123459836121234569 求最長重複子串: 原串:36123459836121234569 最長重複子串:12345 關於這個問題有KMP優化,暫時還沒掌握 下面這個演算法在輸入輸出方面還有待優化 #include <
位元組跳動2018.9.9筆試 最長不重複子串
題目描述 給定一個字串,請找出其中無重複字元的最長子字串的長度。例如,“abcabcbb”,其無重複字元的最長子字串實“abc”,其長度為3。“bbbbb”,其無重複字元的最長子字串是“b”,長度為1。 此題是leetcode第三題原題。 本人思路 以上圖為例