From 50de25757b7c329dc35d7544ffb951d38c3cb7b4 Mon Sep 17 00:00:00 2001 From: Ram Patra Date: Tue, 16 Apr 2019 21:54:31 +0100 Subject: [PATCH] Anagrams in string: done --- README.md | 3 +- .../leetcode/strings/AnagramsInString.java | 79 ++++++++++++++++--- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 79c62a96..989a3224 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/main/java/com/leetcode/strings/AnagramsInString.java b/src/main/java/com/leetcode/strings/AnagramsInString.java index a524b39f..9243d015 100644 --- a/src/main/java/com/leetcode/strings/AnagramsInString.java +++ b/src/main/java/com/leetcode/strings/AnagramsInString.java @@ -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 findAllAnagramsInTextNaive(String text, String pattern) { List 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 7ms on + * leetcode. + * + * @param text + * @param pattern + * @return + */ + private static List findAllAnagramsInText(String text, String pattern) { + List 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")); } } \ No newline at end of file