Sherlock and Anagrams

Sort by

recency

|

1693 Discussions

|

  • + 0 comments
    import java.io.*;
    import java.math.*;
    import java.security.*;
    import java.text.*;
    import java.util.*;
    import java.util.concurrent.*;
    import java.util.regex.*;
    
    public class Solution {
    
        // Complete the sherlockAndAnagrams function below.
        static int sherlockAndAnagrams(String s) {
            Map<String,Integer> al=new HashMap<>();
            int c=0;
        for(int x=0;x<s.length();x++)
        {
            for(int y=0+x;y<s.length();y++)
            {
                char ar[]=(s.substring(x,y+1)).toCharArray();
                Arrays.sort(ar);
                String q=(String.valueOf(ar));
                Integer o=al.get(q);
                if(o==null)
                {
                    al.put(q,1);
                }
                else
                {
                    al.put(q,o+1);    
                }
            }
        }
            for(String as:al.keySet())
            {
                int ww=al.get(as);
                c+=ww*(ww-1)/2;
            }
        return c;
        }
    
        private static final Scanner scanner = new Scanner(System.in);
    
        public static void main(String[] args) throws IOException {
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
    
            int q = scanner.nextInt();
            scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
    
            for (int qItr = 0; qItr < q; qItr++) {
                String s = (scanner.nextLine());
    
                int result = sherlockAndAnagrams(s);
    
                bufferedWriter.write(String.valueOf(result));
                bufferedWriter.newLine();
            }
    
            bufferedWriter.close();
    
            scanner.close();
        }
    }
    
  • + 0 comments
        public static int sherlockAndAnagrams(String s) {
            HashMap<String, Integer> map = new HashMap<>();
            
            for (int i = 0; i < s.length(); i++) {
                for (int j = i; j < s.length(); j++) {
                    char[] arr = s.substring(i, j + 1).toCharArray();
                    Arrays.sort(arr);
                    String keyVal = String.valueOf(arr);
                    
                    map.put(keyVal, map.getOrDefault(keyVal, 0) + 1);
                }
            }        
            // System.out.println(map);
            
            int pairs = 0;
            for (String key : map.keySet()) {
                Integer val = map.get(key);
                pairs += (val * (val - 1)) / 2; 
            }
    
            return pairs;
        }
    
  • + 0 comments

    Perl:

    sub sherlockAndAnagrams {
        my $s = shift;
        my @res;
        my %h;
        my $cnt = 0;
        
        for (my $i = 0; $i < length($s); $i++){
            for (my $j = $i + 1; $j <= length($s); $j++) {
                push(@res, substr($s, $i, $j - $i));
            }
        }
        
        my @sorted = map {join("", sort {$a cmp $b } split("", $_))} @res;
        foreach (@sorted) {
            $h{$_} += 1;
        }
        foreach (values(%h)) {
            $cnt += $_ * ($_ - 1) / 2 if ($_ > 1);
        }
        
        return $cnt;
    }
    
  • + 0 comments

    C#

    public static int sherlockAndAnagrams(string s)
    {
        var anagrams = 0;
        var frequency = new Dictionary<string, int>();
    
        for (int i = 0; i < s.Length; i++)
        {
            for (int j = i + 1; j <= s.Length; j++)
            {
                var sub = new string(s.Substring(i, j - i).OrderBy(s => s).ToArray());
    
                if (frequency.ContainsKey(sub))
                    frequency[sub]++;
                else
                    frequency[sub] = 1;
            }
        }
    
        foreach (var (key, value) in frequency)
            anagrams += value * (value - 1) / 2;
    
        return anagrams;
    }
    
  • + 0 comments

    C#

    public static int sherlockAndAnagrams(string s)
    {
        var anagrams = 0;
        var windows = s.Length - 1;
    
        for (int w = 1; w <= windows; w++)
        {
            for (int i = 0; i <= s.Length - w - 1; i++)
            {
                for (int j = i + 1; j <= s.Length - w; j++)
                {
                    var str1 = s.Substring(i, w);
                    var str2 = s.Substring(j, w);
    
                    var sortedStr1 = new string(str1.OrderBy(c => c).ToArray());
                    var sortedStr2 = new string(str2.OrderBy(c => c).ToArray());
    
                    if (sortedStr1 == sortedStr2)
                    {
                        anagrams++;
                    }
                }
            }
        }
    
        return anagrams;
    }