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。


代码:

public class Solution {
    public boolean repeatedSubstringPattern(String str) {
        int i;
        int n = str.length();
        int m;
        int flag=0;      
        
        for(i=n/2; i>=1; i--){     //i为原字符串的可重复子串的子串的长度;对每种可能长度的子串进行遍历,i为子串长度。
            if( n%i == 0 ){         //n%i == 0:长度为i的子串可以切分str,否则,str的长度不能整除i,表示str就不可能由若干子串重复组成
                m = n/i;            //m: str中长度为i的子串的个数     
                
                for(int j=0; j <i; j++){      //比较m个长度为i的子串是否相等,j遍历子串的每个字符
                    flag=0;                 //标记所有子串所有元素是否相等
                    for(int k=1;k<m;k++) {          //k遍历所有子串
                        if(str.charAt(j) != str.charAt(j+k*i)){        //比较子串的第j个位置的字符是否相等
                            flag = 1;                                  //如果不等,则退出比较,当前子串长度i的划分不满足要求,结束,更新i,进行下一次的搜索
                            break;
                        }
                    }
                    if(flag == 1) {
                        break;
                    }
                }
                
             if(flag == 0){        //如果当前子串长度为i的划分,能够使每个子串都相等,则满足要求,返回true       
                 return true;
             }
             
            }
        }
        return false;               //如果子串长度i的所有划分都不满足要求,则返回flase,表示该字符串不能由某个子串的若干倍组成
    }
}


笔记:

1、java的string类的字符串str,获取第j个位置的字符,要用str.charAt(j)来实现;(感觉好麻烦)

2、java的bool变量的取值是小写的:true、flase;记住是小写,跟python不同。




代码2:

public class Solution {
    public boolean repeatedSubstringPattern(String str) {
        int i,j;
        int n = str.length();
        int m;
        int flag=0;
        
        for(i=n/2; i>=1; i--){     //i为原字符串的可重复子串的子串的长度
            if( n%i == 0 ){         //n%i == 0:长度为i的子串可以切分str,否则,str的长度不能整除i,表示str就不可能由若干子串重复组成
                m = n/i;            //m: str中长度为i的子串的个数 
                
                String substr1 = str.substring(0,i);            //比较每个子串是否相等,substr1为第一个子串   
                
                for(j=1; j<m; j++){                             
                    String substr2 = str.substring(j*i,(j+1)*i);            //substr2为遍历的其他子串
                    if(!substr1.equals(substr2)) {                            //判断substr1与substr2是否相等
                        break;                                                    //如果不等,则跳出循环
                    }
                }
                if(j==m){                                   //如果全部比较完才跳出上面的循环,此时j==m,则表示能找到一个子串,重复若干次变成str,返回true
                    return true;                           
                }     
            }
        }
        return false;               //如果子串长度i的所有划分都不满足要求,则返回flase,表示该字符串不能由某个子串的若干倍组成
    }
}


笔记:

1、string类型截取子串的函数:str.substring(0,i);截取子串的位置从0开始,到i-1结束,长度为i;

所以,substring的参数是(起始位置,终止位置+1)

2、判断两个string类型的字符串是否相等,用substr1.equals(substr2),返回true,则相等;否则不相等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值