我刚一见到这个题解的时候,脑子里蹦出了插入排序的那个代码,虽然只是一个简单题,但是这个题细节方面写的也是一个细节怪的写法,就是这句i <= n - m;一懵还不理解,意思就是如果n - m个字符还没能匹配的上的话,那就没了呀 ……
整体的时间复杂度O((n - m)*m)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { intstrStr(String ss, String pp){ intm= ss.length(), n = pp.length(); if (n > m) return -1; //对于原串进行逐个遍历 for (inti=0; i <= m - n; i++) { inta=0, b = i; //匹配串遍历 while (a < n && ss.charAt(b) == pp.charAt(a)){ a++; b++; } if (a == n) return i; } return -1; } }
classSolution { publicintrepeatedStringMatch(String a, String b) { intm= a.length(), n = b.length(); //首尾各个添加一个 if (!check(a, b)) return -1; inti= n / m + 2; Stringrepeat= a.repeat(i); if (!repeat.contains(b)) return -1; for (intj= i - 1; j >= 0; j--){ if (!a.repeat(j).contains(b)) return j + 1; } return -1; } booleancheck(String a, String b){ Set<Character> set = newHashSet<>(); for (char c : a.toCharArray()) set.add(c); for (char c : b.toCharArray()){ if (!set.contains(c)) returnfalse; } returntrue; } }
classSolution { publicintrepeatedStringMatch(String a, String b) { StringBuilderbs=newStringBuilder(); intret=0; while (bs.length() < b.length()){ bs.append(a); ret++; } //想要完全匹配,至少bs的长度得大于b的长度,等于都不行 bs.append(a); intidx= strStr(bs.toString(), b); if (idx == -1) return -1; //因为bs在最后多加了一次,所以不能使用bs // return idx + b.length() < bs.length() ? ret : ret + 1; return idx + b.length() <= a.length()*ret ? ret : ret + 1; }
intstrStr(String ss, String pp){ intm= ss.length(), n = pp.length(); if (n > m) return -1; //对于原串进行逐个遍历 for (inti=0; i <= m - n; i++) { inta=0, b = i; //匹配串遍历 while (a < n && ss.charAt(b) == pp.charAt(a)){ a++; b++; } if (a == n) return i; } return -1; } }