1. 程式人生 > >leetcode_459(重複子串模式)

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第三題原題。 本人思路 以上圖為例