leetCode
来源:互联网 发布:唐勇的seo分享平台 编辑:程序博客网 时间:2024/06/15 03:37
题目:
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.
思路与步骤:
思路如下:
1. 用一个变量存储 substring (后面通称 sub),该子集内容为 原string (后面通称 s) 的第一个字符起,到某个字符终止;
2. sub 的长度可以整除 s 的长度;通过这点即可以判断;
3. 所以难点是找到 sub 的终止字符,即 sub 的长度 sublen。
得到如下步骤:
第一步,给 sub 赋值,长度为 sublen;
第二步,依次判断 s 中每 sublen 长度的子串是否与 sub 相等;
第三步,判断 sublen 是否可以整除 s.length()
解决问题:
找不到sublen,只能用循环来判断。所以在上面三步的最外面加一层循环即可。此时问题变成由于多重循环效率较低,所以做如下改进。
在第一层循环中先判断整除关系;sublen 的长度从最大(s.length()/2 )开始。
别人的解法:
思路大体一致,但是在 s 与 sub 匹配中用到了 StringBuilder
编程实现:
public class Solution { public boolean repeatedSubstringPattern(String s) { int slen = s.length(); if(slen == 1) return false; for(int sublen=slen/2; sublen > 0; sublen--){ if(slen % sublen == 0){ String subS = s.substring(0,sublen); int j = 0; //s[j] is the first of subS, s[j,i+sublen] equals subS while(j<slen-sublen && s.substring(j,j+sublen).equals(subS)) j+=sublen; if(j==slen-sublen && s.substring(j,j+sublen).equals(subS)) return true; } } /* StringBuilder subSb = new StringBuilder(); for(int sublen=1; sublen<=s.length()/2; sublen++){ if(s.length()%sublen==0){ subSb.delete(0,sublen-1); for(int i=0; i<sublen; i++) subSb.append(s.charAt(i)); int j = 0; while(j<s.length()-sublen && s.substring(j,j+sublen).equals(subSb.toString())) j+=sublen; if(j==s.length()-sublen && s.substring(j,s.length()).equals(subSb.toString())) return true; } }*/ return false; }}
其中 j 的含义:subS 的第一个字母在 s 中的下标,也就是说 s[j,i+sublen] 等于 subS
改进的地方:
1. sublen 从最大值开始;
2. 虽然 sub 长度不确定,但是在每次循环时都是确定的,所以不需要用 StringBuilder,直接 String 即可。
别人的程序:
public class Solution { public boolean repeatedSubstringPattern(String s) { int slen = s.length(); if(slen == 1) return false; for(int sublen=slen/2; sublen > 0; sublen--){ if(slen % sublen == 0){ int count = slen / sublen; String subS = s.substring(0,sublen); StringBuilder sb = new StringBuilder(); for(int j=0; j < count; j++) sb.append(subS);if(sb.toString().equals(s)) return true; } } return false; }}
当然,这个程序效率并没有上面的高。
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- 算法训练 2的次幂表示
- Ajax实现文件上传
- 动态树分治——模板整理
- 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵
- Android 开发艺术探索 读书笔记2
- leetCode
- 程序员的自我修养
- 1090. Highest Price in Supply Chain
- ArrayList和LinkedList的区别
- 第三章 JAVA内存结构(3)
- 【BZOJ 1046】【HAOI 2007】上升序列
- mysql 5.5多实例部署
- Java Web会话机制,Cookie和Session详解
- C# 树状视图