From 8cfc915acc641599a9ace7052c684a19299f5866 Mon Sep 17 00:00:00 2001 From: Qilin ZHANG Date: Sun, 17 May 2020 23:08:29 +0200 Subject: [PATCH] Add java sliding window solution --- .../Find-All-Anagrams-In-A-String.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/May-LeetCoding-Challenge/17-Find-All-Anagrams-In-A-String/Find-All-Anagrams-In-A-String.java b/May-LeetCoding-Challenge/17-Find-All-Anagrams-In-A-String/Find-All-Anagrams-In-A-String.java index 090a175..a1381f6 100644 --- a/May-LeetCoding-Challenge/17-Find-All-Anagrams-In-A-String/Find-All-Anagrams-In-A-String.java +++ b/May-LeetCoding-Challenge/17-Find-All-Anagrams-In-A-String/Find-All-Anagrams-In-A-String.java @@ -67,6 +67,39 @@ public List findAnagrams(String s, String p) { if(isAnagram(subString, p)) res.add(i); } + return res; + } +} + +// Sliding windows solution +class Solution3 { + private boolean checkDiff(int[] diff){ + for (int i = 0; i < diff.length; i++) + if (diff[i] != 0) return false; + + return true; + } + + public List findAnagrams(String s, String p) { + List res = new ArrayList<>(); + int sLength = s.length(), pLength = p.length(); + if(sLength < pLength || s == null) return res; + + int[] diff = new int[26]; + + for(int i = 0; i < pLength; i++) { + diff[p.charAt(i) - 'a']--; + diff[s.charAt(i) - 'a']++; + } + if(checkDiff(diff)) res.add(0); + + //sliding window + for (int i = pLength; i < sLength; i++) { + diff[s.charAt(i) - 'a']++; + diff[s.charAt(i - pLength) - 'a']--; + if(checkDiff(diff)) res.add(i - pLength + 1); + } + return res; } } \ No newline at end of file