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.)

热泪盈眶,第一次先在纸上把思路完全理清楚再码代码,除了测试了一回改了个小bug,然后竟然提交一次过了。。果然刷题需要先理清思路啊,不能盲目码代码啊。时间level是92%,看了下思路几乎就是这样,只是string的api了解的比较少,可以优化一下

题意:

判断一个字符串是否可以由子字符串整数次循环得到

思路:

首先要认识到,子串循环是从第一位开始,所以可以查找字符串中所有第一位字母,以此来分隔子串。

  1. 用可变的StringBuilder str来保存子串,先录入字符串第一位
  2. 从第二位开始,循环字符串,因为最少是循环两次,所以正确子串最长是字符串的一半,只需要遍历到中间位置。
  3. 寻找与第一位相同的字母,如果不相同就存入子串
  4. 找到相同字母后,用一个do while循环来判断字符串是不是子串的循环。用indexOf(str, int)方法,如果每次输出的index都与子串的倍数位置相等,证明字符串是子串的循环,返回true。

bug:

  1. 一开始for从i=0开始了,但是后来有需要除以i,所以i不能等于0
  2. indexOf(str,int)的str需要是String类,如果是StringBuilder需要用toString()方法转换成String才能使用

知识点:

  1. indexOf(str,int)的str需要是String类,如果是StringBuilder需要用toString()方法转换成String才能使用
  2. str.append()
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int len = s.length();
        StringBuilder str = new StringBuilder();
        char[] s_char = s.toCharArray();
        str.append(s_char[0]);
        //是否存在合格的分隔(i),使子串str(0~i)可以循环组成字符串s
        for(int i=1;i<len/2+1;i++){
            if(s_char[i] != s_char[0]){
                str.append(s_char[i]);
            }else{
                if(len%i != 0){//i != 0
                    str.append(s_char[i]);
                }else{
                    int index = 0;
                    int price = 0;
                    do{
                        price = price + i;//每组str倍数位置
                        index = s.indexOf(str.toString(),price);//找到一样的位置
                    }while((index == price) && (price+i < len));//注意最后一次匹配到的位置是len-i
                    if(index + i == len){//判断是否可以用子串循环到底
                        return true;
                    }else{
                        str.append(s_char[i]);
                    }                      
                }
            }
        }
        return false;
    }
}

你可能感兴趣的:(leetcode)