Skip to content

Commit

Permalink
Anagrams in string: done
Browse files Browse the repository at this point in the history
  • Loading branch information
rampatra committed Apr 16, 2019
1 parent 0406fe1 commit 50de257
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 13 deletions.
3 changes: 2 additions & 1 deletion README.md
Expand Up @@ -32,7 +32,8 @@ You can also refer to my [Java Notes](http://java.ramswaroop.me) for a quick ref
4. [Trees and Graphs](/src/main/java/com/ctci/treesandgraphs)
5. [Bit Manipulation](/src/main/java/com/ctci/bitmanipulation)
6. [Recursion and DP](/src/main/java/com/ctci/recursionanddp)
3. [HackerRank](/src/main/java/com/hackerrank).
3. [LeetCode](/src/main/java/com/leetcode).
4. [HackerRank](/src/main/java/com/hackerrank).


## Environment
Expand Down
79 changes: 67 additions & 12 deletions src/main/java/com/leetcode/strings/AnagramsInString.java
Expand Up @@ -6,47 +6,102 @@

/**
* Leetcode Problem: https://leetcode.com/problems/find-all-anagrams-in-a-string/
*
*
* @author rampatra
* @since 2019-04-13
*/
public class AnagramsInString {

/**
* Time complexity: O ((n-m) * m log m)
* where,
* n = text length
* m = pattern length
*
* @param text
* @param pattern
* @return
*/
private static List<Integer> findAllAnagramsInTextNaive(String text, String pattern) {
List<Integer> indexes = new ArrayList<>();

int textLen = text.length();
int patternLen = pattern.length();

char[] patternChars = pattern.toCharArray();
Arrays.sort(patternChars); // takes O(m log m) time
String patternSorted = String.valueOf(patternChars);

String subText;
char[] subTextChars;
String subTextSorted;

for (int i = 0; i <= textLen - patternLen; i++) { // loops n-m number of times
subText = text.substring(i, i + patternLen);
subText = text.substring(i, i + patternLen);
subTextChars = subText.toCharArray();
Arrays.sort(subTextChars); // sorts m number of characters, takes O(m log m)
subTextSorted = String.valueOf(subTextChars);

if (subTextSorted.equals(patternSorted)) { // compare m characters takes m time
indexes.add(i);
}
}
return indexes;
}


/**
* Time complexity: O(n). Completes within <a href="https://leetcode.com/submissions/detail/222911434/">7ms on
* leetcode.</a>
*
* @param text
* @param pattern
* @return
*/
private static List<Integer> findAllAnagramsInText(String text, String pattern) {
List<Integer> indices = new ArrayList<>();

int textLen = text.length();
int patternLen = pattern.length();

int[] textCharCountInWindow = new int[26];
int[] patternCharCount = new int[26];

for (int i = 0; i < patternLen; i++) {
patternCharCount[pattern.charAt(i) - 'a']++;
}

for (int i = 0; i < textLen; i++) {
textCharCountInWindow[text.charAt(i) - 'a']++;
if (i >= patternLen) {
textCharCountInWindow[text.charAt(i - patternLen) - 'a']--;
}
if (Arrays.equals(textCharCountInWindow, patternCharCount)) { // loops 26 times no matter the text/pattern length
indices.add(i - patternLen + 1);
}
}

return indices;
}

public static void main(String[] args) {
// basic use cases
System.out.println(findAllAnagramsInTextNaive("cbaebabacd", "abc"));
System.out.println(findAllAnagramsInTextNaive("abab", "ab"));

// corner cases
System.out.println(findAllAnagramsInTextNaive("abab", ""));
System.out.println(findAllAnagramsInTextNaive("af", "af"));
System.out.println(findAllAnagramsInTextNaive("af", "be"));

// corner case
System.out.println(findAllAnagramsInTextNaive("", "ab"));
System.out.println(findAllAnagramsInTextNaive("", ""));

System.out.println("-----");

// basic use cases
System.out.println(findAllAnagramsInText("cbaebabacd", "abc"));
System.out.println(findAllAnagramsInText("abab", "ab"));
System.out.println(findAllAnagramsInText("af", "af"));
System.out.println(findAllAnagramsInText("af", "be"));

// corner case
System.out.println(findAllAnagramsInText("", "ab"));
}
}

0 comments on commit 50de257

Please sign in to comment.