[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 together. You may assume the given string consists of lowercase English letters only and its length will not exceed 10000.
Example 1:
Input: "abab" Output: True Explanation: It's the substring "ab" twice.
Example 2:
Input: "aba" Output: False
Example 3:
Input: "abcabcabcabc" Output: True Explanation: It's the substring "abc" four times. (And the substring "abcabc" twice.)
给定一个非空字符串,判断它是否可以通过自身的子串重复若干次构成。你可以假设字符串只包含小写英文字母,并且长度不会超过10000
解法1: 暴力法Brute Force
解法2:KMP,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置。
Java: 直接截取了重复验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Solution { public boolean repeatedSubstringPattern(String str) { int n = str.length(); for ( int i=n/ 2 ;i>= 1 ;i--) { if (n%i== 0 ) { int m = n/i; String substring = str.substring( 0 ,i); StringBuilder sb = new StringBuilder(); for ( int j= 0 ;j<m;j++) { sb.append(substring); } if (sb.toString().equals(str)) return true ; } } return false ; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution( object ): def repeatedSubstringPattern( self , str ): """ :type str: str :rtype: bool """ size = len ( str ) for x in range ( 1 , size / 2 + 1 ): if size % x: continue if str [:x] * (size / x) = = str : return True return False |
Python: KMP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public : bool repeatedSubstringPattern(string str) { int n = str.size(); for ( int i = n / 2; i >= 1; --i) { if (n % i == 0) { int c = n / i; string t = "" ; for ( int j = 0; j < c; ++j) { t += str.substr(0, i); } if (t == str) return true ; } } return false ; } }; |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution { public : bool repeatedSubstringPattern(string str) { int i = 1, j = 0, n = str.size(); vector< int > dp(n + 1, 0); while (i < n) { if (str[i] == str[j]) dp[++i] = ++j; else if (j == 0) ++i; else j = dp[j]; } return dp[n] && (dp[n] % (n - dp[n]) == 0); } }; |
类似题目:
[LeetCode] 28. Implement strStr() 实现strStr()函数
[LeetCode] 686. Repeated String Match
All LeetCode Questions List 题目汇总
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验