publicintrepeatedStringMatch(String a, String b){ if (a.equals(b) || a.contains(b)) { return1; }
int minRepeatTimes = Math.max(1, b.length() / a.length() + 1);
StringBuilder res = new StringBuilder(a); for (int i = 2; i <= minRepeatTimes + 1; i++) { res.append(a); if (res.toString().contains(b)) { return i; } }
publicintrepeatedStringMatch(String a, String b){ if (a.equals(b) || a.contains(b)) { return1; }
int lenA = a.length(); int lenB = b.length();
StringBuilder sb = new StringBuilder(a); int ans = 1; while (sb.length() < b.length()) { ans++; sb.append(a); } int lenS = sb.length(); sb.append(a); for (int i = 0; i < lenA; i++) { if (i + lenB <= sb.length() && sb.substring(i, i + lenB).hashCode() == b.hashCode()) { return i + lenB <= lenS ? ans : ans + 1; } }
publicintrepeatedStringMatch(String a, String b){ int an = a.length(), bn = b.length(); int index = strStr(a, b); if (index == -1) { return -1; } if (an - index >= bn) { return1; } return (bn + index - an - 1) / an + 2; }
publicintstrStr(String haystack, String needle){ int n = haystack.length(), m = needle.length(); if (m == 0) { return0; }
int k1 = 1000000009; int k2 = 1337; Random random = new Random(); int kMod1 = random.nextInt(k1) + k1; int kMod2 = random.nextInt(k2) + k2;
long hashNeedle = 0; for (int i = 0; i < m; i++) { char c = needle.charAt(i); hashNeedle = (hashNeedle * kMod2 + c) % kMod1; } long hashHaystack = 0, extra = 1; for (int i = 0; i < m - 1; i++) { hashHaystack = (hashHaystack * kMod2 + haystack.charAt(i % n)) % kMod1; extra = (extra * kMod2) % kMod1; } for (int i = m - 1; (i - m + 1) < n; i++) { hashHaystack = (hashHaystack * kMod2 + haystack.charAt(i % n)) % kMod1; if (hashHaystack == hashNeedle) { return i - m + 1; } hashHaystack = (hashHaystack - extra * haystack.charAt((i - m + 1) % n)) % kMod1; hashHaystack = (hashHaystack + kMod1) % kMod1; } return -1; } }