Sherlock and Anagrams

Sort by

recency

|

1694 Discussions

|

  • + 0 comments
    static string sortString(string s) {
            const int MAX_CHAR = 26;
            int[] charCount = new int[MAX_CHAR];
            StringBuilder sb = new StringBuilder();
            
            foreach (char ch in s) {
                charCount[ch - 'a']++;
            }
            
            for (int i = 0; i < MAX_CHAR; i++) {
                for (int j = 0; j < charCount[i]; j++) {
                    sb.Append('a' + i);
                }
            }
            
            return sb.ToString();
        }
        
        static int calculateTotalCombinations(int n){    
            return (n * (n -1)) / 2;
        }
        
        static Dictionary<string, int> findSubstrings(string s) 
        {  
            Dictionary<string, int> dic = new Dictionary<string, int>();
        
            for(int i = 1; i <= s.Length; i++) 
            { 
                for(int j = 0; j <= s.Length - i; j++) 
                {   
                    var substring = sortString(s.Substring(j, i));
                    
                    // Using Substring() function 
                    if(dic.ContainsKey(substring)){
                      dic[substring] = dic[substring] + 1; 
                      continue; 
                    }
                    
                    dic.Add(substring, 1);
                } 
            } 
            
            return dic;
        } 
    
        public static int sherlockAndAnagrams(string s)
        {
            var dic = findSubstrings(s);
            int totalAnagrams = 0;
            
            foreach(var item in dic){
                totalAnagrams+= calculateTotalCombinations(item.Value); 
            }
            
            return totalAnagrams;
        }
    
  • + 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;
    }