(String) Repeated Substring Pattern
13 Nov 2019 | algorithm programming leetcode문자열이 주어졌을 때, 반복되는 부분 문자열로 구성되어 있는지 판별하는 함수를 작성하는 것이다.
아래 함수는 스트링에서 반복되는 문자를 계속 지워나가며 검사한다. 하지만 매우 비효울적이다.
class Solution {
public boolean repeatedSubstringPattern(String s) {
if (s.length() == 1) {
return false;
}
boolean repeated = false;
for (int i = 1; i <= (s.length() / 2); i++) {
StringBuilder stringBuilder = new StringBuilder(s);
String subString = stringBuilder.substring(0, i);
for (int j = 0; j < (s.length()) / i; j++) {
if (stringBuilder.substring(0, i).equals(subString)) {
stringBuilder.delete(0, i);
}
}
if (stringBuilder.toString().isEmpty()) {
repeated = true;
break;
}
}
return repeated;
}
}
KMP 알고리즘을 사용해서 구현하면 훨씬 빨라진다. KMP 소스는 아래를 참고하면 된다.
class Solution {
public boolean repeatedSubstringPattern(String s) {
if (s == null || s.length() <= 1){
return false;
}
int[] next = getNextArray(s);
int n = next.length;
return (n % (n - next[n - 1])) == 0 && next[n - 1] > 0;
}
public int[] getNextArray(String s){
char[] array = s.toCharArray();
int[] next = new int[array.length];
next[0] = 0;
int i = 1;
int j = 0;
while (i < array.length){
if (array[i] == array[j]){
next[i] = j + 1;
j++;
}else{
// array[i] != array[j]
while (j > 0 && array[j] != array[i]){
j = next[j - 1];
}
if (array[i] != array[j]){
next[i] = 0;
}else{
next[i] = j + 1;
j++;
}
}
i++;
}
return next;
}
}