In this post, we will solve Sherlock and Anagrams HackerRank Solution. This problem (Sherlock and Anagrams) is a part of HackerRank Problem Solving series.
Solution – Sherlock and Anagrams – HackerRank Solution
C++
#include <cmath> #include <cstdio> #include <vector> #include <map> #include <iostream> #include <algorithm> using namespace std; map<string, int>::iterator it; int main() { int T; cin>>T; while(T--) { if(T < 0) { break; } string s; cin>>s; map<string, int> string_map; // Look at all substrings of s for(int i = 0; i < s.length(); i++) { for(int j = 1; j <= s.length()-i; j++) { // Sort the substring (lexographically increasing) char letter = 'a'; string substring, sorted_substring; substring = s.substr(i, j); for(int k = 0; k < 27; k++) { for(int l = 0; l < substring.length(); l++) { if(substring[l] == letter) { sorted_substring += letter; } } letter++; } // Count the number of occurences of the (sorted) substring if(string_map.count(sorted_substring) == 0) { string_map[sorted_substring] = 0; } else { string_map[sorted_substring] += 1; } } } int count = 0; // For every substring that appears more than once, the number of "unordered anagramic pairs" // is equal to n(n+1)/2, where n is the number of occurences for (it = string_map.begin(); it != string_map.end(); it++) { int value = it->second; if(value > 0) { count += (value*(value+1)/2); } } cout<<count<<"\n"; } return 0; }
Python
cases = int(input()) for caseNo in range(cases): s = input() n = len(s) res = 0 for l in range(1, n): cnt = {} for i in range(n - l + 1): subs = list(s[i:i + l]) subs.sort() subs = ''.join(subs) if subs in cnt: cnt[subs] += 1 else: cnt[subs] = 1 res += cnt[subs] - 1 print(res)
Java
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. public static final int ALPHABET_CNT = 26; static boolean isAnagrams(String s1, String s2) { char[] chCnt1 = new char[ALPHABET_CNT]; char[] chCnt2 = new char[ALPHABET_CNT]; for (int i = 0, n = s1.length(); i < n; i++) { chCnt1[s1.charAt(i) - 97] += 1; chCnt2[s2.charAt(i) - 97] += 1; } for (int i = 0; i < ALPHABET_CNT; i++) { if (chCnt1[i] != chCnt2[i]) { return false; } } return true; } // Complete the sherlockAndAnagrams function below. static int sherlockAndAnagrams(String s) { int cnt = 0; for (int i = 1, n = s.length(); i < n; i++) { List<String> subsetList = new ArrayList<>(); for (int j = 0; j < n; j++) { if (i + j <= n) { subsetList.add(s.substring(j, i + j)); } } for (int k = 0, size = subsetList.size(); k < size; k++) { for (int l = k + 1; l < size; l++) { if (isAnagrams(subsetList.get(k), subsetList.get(l))) { cnt++; } } } } return cnt; } 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(); } }
Note: This problem (Sherlock and Anagrams) is generated by HackerRank but the solution is provided by CodingBroz. This tutorial is only for Educational and Learning purpose.