Jerry's Blog

Recording what I learned everyday

View on GitHub


18 September 2019

LeetCode(11) -- 459, 771

by Jerry Zhang

P459. Repeated Substring Pattern (Easy)

给一个字符串,判断它是否是由多个子字符串重复而成的。只有小写英文字母。

Input: "abab"
Output: True
Explanation: It's the substring "ab" twice.

我的思路

如何找出开始重复的点?如果发现跟第一个字母相同,就开始往后对比,直到完全相同,说明找到了一个周期,如果遇到任何一个不一样,就要再看是否跟第一个字母一样。

这个算法是错的。因为如果是”abcabcef”作为一周期,到第二个c时,我以为找到了一个周期,实际上我应该更新第二周期的起始点,因为刚才的周期是错误的。

我的代码


写了半天总有bug,放弃。

讨论区

int l = str.length();
	for(int i=l/2;i>=1;i--) {
		if(l%i==0) {
			int m = l/i;
			String subS = str.substring(0,i);
			StringBuilder sb = new StringBuilder();
			for(int j=0;j<m;j++) {
				sb.append(subS);
			}
			if(sb.toString().equals(str)) return true;
		}
	}
	return false;

66%

最优解

class Solution {
    public boolean repeatedSubstringPattern(String s) {
        int len = s.length();
        if (len <= 1) {
            return false;
        }
        char last = s.charAt(len - 1);
        int val = s.lastIndexOf(last, len / 2 - 1) + 1;
        while (val > 0) {
            if (len % val == 0) {
                String pat = s.substring(0, val);
                boolean res = true;
                for (int i = val; i < len; i += val) {
                    if (!s.substring(i, i + val).equals(pat)) {
                        res = false;
                        break;
                    }
                }
                if (res) {
                    return res;
                }
            }
            val = s.lastIndexOf(last, val - 2) + 1;
        }
        return false;
    }
}

暂时无法理解,留个坑,将来有空再看。。。

P771. Jewels and Stones (Easy)

一个字符串J记录所有代表珠宝的字母,第二个字符串S记录我手中所有的石头,包含珠宝,因为珠宝也是石头的一种。 问我手中的石头中有多少个是珠宝。

Input: J = "aA", S = "aAAbbbb"
Output: 3

我的思路

先通过J字符串,用一个布尔型数组记录下哪些字母是珠宝; 再挨个看S里面有多少是属于珠宝的即可。

我的代码

class Solution {
    public int numJewelsInStones(String J, String S) {
        int counter = 0;
        boolean[] letters = new boolean[58];
        for (int i = 0; i < J.length(); i++) {
            letters[J.charAt(i) - 'A'] = true;
        }
        for (int i = 0; i < S.length(); i++) {
            if (letters[S.charAt(i) - 'A']) {
                counter++;
            }
        }
        return counter;
    }
}

100%

最优解

class Solution {
    public int numJewelsInStones(String J, String S) {
        int sum = 0;
        for(char c: S.toCharArray()){
            if(J.indexOf(c) >= 0)
                sum++;
        }
        return sum;
    }
}

这个答案虽然很短,但时间复杂度其实是m * n。indexOf方法是需要字符串整体搜索的。我觉得不好。

tags: LeetCode