LeetCode459. 重复的子字符串

青旅半醒 2022-05-23 07:47 269阅读 0赞

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

  1. 输入: "abab"
  2. 输出: True
  3. 解释: 可由子字符串 "ab" 重复两次构成。

示例 2:

  1. 输入: "aba"
  2. 输出: False

示例 3:

  1. 输入: "abcabcabcabc"
  2. 输出: True
  3. 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

思路:s字符串长度为n,依次取得长度为1~(n/2)的s字符串的子串s1,进而判断s是否由s1重复构成,其中一个s1满足条件即可。

  1. class Solution {
  2. public boolean repeatedSubstringPattern(String s) {
  3. int len=s.length();
  4. for(int i=1;i<=len/2;i++) {
  5. String sonStr=getSonString(s,i);
  6. boolean b=isSonString(s,sonStr);
  7. if(b==true) {
  8. return true;
  9. }
  10. }
  11. return false;
  12. }
  13. //得到从0到n的子串
  14. public String getSonString(String s,int n) {
  15. char a[]=new char[n];
  16. for(int i=0;i<n;i++) {
  17. a[i]=s.charAt(i);
  18. }
  19. String str=new String(a);
  20. return str;
  21. }
  22. //判断s2是否是s1的循环子串
  23. public boolean isSonString(String s1,String s2) {
  24. int len1=s1.length();
  25. int len2=s2.length();
  26. if(len1%len2!=0) {
  27. return false;
  28. }
  29. int i,j;
  30. for(i=0,j=0;i<len1;) {
  31. // System.out.println(s1.charAt(i)+" "+s2.charAt(j));
  32. if(s1.charAt(i)!=s2.charAt(j)) {
  33. // System.out.println("no");
  34. return false;
  35. }
  36. i++;j++;
  37. if(j==len2) {
  38. j=0;
  39. }
  40. }
  41. return true;
  42. }
  43. }

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 459. 重复字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: "abab"