veryinnocentboy

Untitled

May 14th, 2021 (edited)
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.33 KB | None | 0 0
  1. // https://leetcode.com/problems/find-all-anagrams-in-a-string/
  2. class Solution {
  3.     public List<Integer> findAnagrams(String s, String p) {
  4.         List<Integer> l = new LinkedList<>();
  5.         if(s.length() < p.length()) return l;
  6.         int[] sampleMap = makeMap(p);
  7.         int window = p.length();
  8.         int[] currentMap = makeMap(s.substring(0, window));
  9.        
  10.         int i = window;
  11.  
  12.         if(isMapEqual(sampleMap, currentMap)){
  13.             l.add(i-window);
  14.         }
  15.         while(i < s.length()){
  16.             --currentMap[s.charAt(i-window) - 'a'];
  17.             ++currentMap[s.charAt(i) - 'a'];
  18.             if(isMapEqual(sampleMap, currentMap)){
  19.                 l.add(i-window+1);
  20.             }
  21.             ++i;
  22.         }
  23.         return l;
  24.     }
  25.    
  26.    
  27.     static int[]  makeMap(String s){
  28.         int[] map = new int[26];
  29.  
  30.             for(int i=0;i<map.length;++i){
  31.                 map[i] = 0;
  32.             }
  33.  
  34.             for(int i=0;i<s.length();++i){
  35.                 map[s.charAt(i) - 'a'] += 1;
  36.             }
  37.         return map;
  38.     }
  39.     static boolean isMapEqual(int [] a, int[] b){
  40.         if(a.length != b.length) return false;
  41.         for(int i=0;i<a.length;++i){
  42.             if(a[i] != b[i]) return false;
  43.         }
  44.         return true;
  45.     }
  46. }
  47.  
  48.  
  49. //////////////////////////////////////////////
  50. // more efficient solution:
  51. class Solution {
  52.     public List<Integer> findAnagrams(String s, String p) {
  53.         Map<Character, Integer> mymap = new HashMap<>();
  54.         List<Integer> res = new LinkedList<>();
  55.         for(char c : p.toCharArray()){
  56.             mymap.put(c, mymap.getOrDefault(c, 0) + 1);
  57.         }
  58.         int start = 0, end = 0, count = mymap.size(), len = s.length();
  59.         while(end < len){
  60.             char r = s.charAt(end);
  61.             mymap.put(r, mymap.getOrDefault(r, 0)-1);
  62.             if(mymap.get(r) == 0) count--;
  63.             end++;
  64.            
  65.            
  66.             while(count == 0){
  67.                 if(end-start == p.length()){
  68.                     res.add(start);
  69.                 }
  70.                
  71.                
  72.                 char x = s.charAt(start);
  73.                 mymap.put(x, mymap.getOrDefault(x, 0) + 1);
  74.                 if(mymap.get(x) > 0) count++;
  75.                 start++;
  76.             }
  77.         }
  78.         return res;
  79.     }
  80. }
Add Comment
Please, Sign In to add comment