【第22期】观点:IT 行业加班,到底有没有价值?

leetcode_459(重复子串模式)

原创 2017年01月04日 00:09:52

一、题目大意
给定一个非空字符串,判断它是否可以通过自身的子串重复若干次构成。你可以假设字符串只包含小写英文字母,并且长度不会超过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
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

查找一个字符串中最大重复子串(C语言版)

#include #include /* 找出一个字符串最大相同子串,如果有多个重复子串,则要求返回最后一个位置的子串 */ void print_sub(char *p, int len...

寻找一个字符串中的最长重复子串

思路: 主要就是先定义一个后缀数组,将后缀数组排序后求共最长公共长度 问题描述: 首先这是一个单字符串问题。子字符串 R 在字符串 L 中至少出现两次,则称 R 是 L 的重复子串。比...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

输出一个字符串中重复出现的子串和其出现的次数(JS实现)

题外话:一晃来到新公司四个月了,笔者已从JavaWeb开发转行做iOS开发了,基本上相当于完全从头开始吧!于是这几个月就忙于学习诡异的Objective-C和iOS了,项目比较忙一直没有时间把之前面试...

【每日面试题】给定一个字符串,求出其最长的重复子串

题目:给定一个字符串,求出其最长的重复子串 如字符串abcdabcabcd,求的最长重复子串为abcd 代码: void LongChar(char* str) {  if(str==NUL...
  • qunqin
  • qunqin
  • 2012-03-02 14:42
  • 5942

求S字符串中最长重复子串

/* * 题意: * 如: S = "abcdsetseabcd" 这个字符串中的最长重复子串就是abcd,长度为4 S = "tmabcdefpiabcdef" 这个字符串的最长重复子...

在一个字符串中找一个最大重复子串

#include bool find_sub_string(const char * str,int str_length,int * offset,int * len){ int start=0...

给定一个字符串,输出最长的重复子串

给定一个字符串,输出最长的重复子序列 举例:ask not what your country can do for you,but what youcan do for your country ...

重复子串问题(三):输出一个字符串中出现频率最高的子串

要求子串长度大于2,且子串可以出现在任意位置//输出一个字符串中出现频率最高的子字符串(要求子串长度大于等于2) #include #include #include #include using n...

给定一个字符串,求出其最长的重复子串。

#include "stdafx.h" #include #include #include #include #include using namespace std; ...

求一个串中出现的第一个最长重复子串

/* ** ** 求一个串中出现的第一个最长重复子串。采用顺序结构存储串,实现求串s中出现的第一个最长重复子串的下标和长度 ** */ #include #include using names...
  • wbxcww
  • wbxcww
  • 2011-10-16 10:42
  • 1158
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)