Skip to content

Commit f495ca2

Browse files
solves rotate string
1 parent 147edd4 commit f495ca2

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@
214214
| 771 | [Jewels and Stones](https://leetcode.com/problems/jewels-and-stones) | [![Java](assets/java.png)](src/JewelsAndStones.java) [![Python](assets/python.png)](python/jewels_and_stones.py) |
215215
| 783 | [Minimum Distance Between BST Nodes](https://leetcode.com/problems/minimum-distance-between-bst-nodes) | [![Java](assets/java.png)](src/MinimumAbsoluteDifferenceInBST.java) [![Python](assets/python.png)](python/minimum_distance_between_bst_nodes.py) |
216216
| 788 | [Rotated Digits](https://leetcode.com/problems/rotated-digits) | |
217-
| 796 | [Rotate String](https://leetcode.com/problems/rotate-string) | |
217+
| 796 | [Rotate String](https://leetcode.com/problems/rotate-string) | [![Java](assets/java.png)](src/RotateString.java) |
218218
| 800 | [Similar RGB Color](https://leetcode.com/problems/similar-rgb-color) | |
219219
| 804 | [Unique Morse Code Words](https://leetcode.com/problems/unique-morse-code-words) | |
220220
| 806 | [Number of Lines to Write String](https://leetcode.com/problems/number-of-lines-to-write-string) | |

src/RotateString.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
public class RotateString {
2+
public boolean rotateString(String s, String goal) {
3+
if (s.length() != goal.length()) return false;
4+
if (s.equals(goal) || s.length() == 0) return true;
5+
return patternExists(s + s, goal);
6+
}
7+
8+
private boolean patternExists(String string, String pattern) {
9+
return kmpIndex(string, pattern) != -1;
10+
}
11+
12+
private int kmpIndex(String string, String pattern) {
13+
int[] patternPrefix = patternPrefixArray(pattern);
14+
for (int t = 0, p = 0 ; t < string.length() && p < pattern.length() ; ) {
15+
if (string.charAt(t) == pattern.charAt(p)) {
16+
if (p == pattern.length() - 1) return t - p;
17+
p++;
18+
t++;
19+
} else if (p != 0) {
20+
p = patternPrefix[p - 1];
21+
} else {
22+
t++;
23+
}
24+
}
25+
return -1;
26+
}
27+
28+
private int[] patternPrefixArray(String pattern) {
29+
int[] patternPrefix = new int[pattern.length()];
30+
for (int j = 0, i = 1 ; i < pattern.length() && j < pattern.length() ; ) {
31+
if (pattern.charAt(j) == pattern.charAt(i)) {
32+
patternPrefix[i++] = j++ + 1;
33+
} else if (j == 0) {
34+
patternPrefix[i++] = 0;
35+
} else {
36+
j = patternPrefix[j - 1];
37+
}
38+
}
39+
return patternPrefix;
40+
}
41+
}

0 commit comments

Comments
 (0)