I have an array of strings arr
and another input string s
.
Now my task is to pick a character from s
and replace all the occurrences of that letter in s
with another character. Then rearrange the characters if needed but this is optional. Now count how many of them are matching with array elements.
I have written code in Java for this, but the approach I followed is not correct.
Example: s = aabbcdbb
arr = {"aabbcdbbb", "aabbcdb", "aabbxdbb", "aabbbdbb", "aacccdcc", "ddbbcdbb", "eebbcdbb"}
Output :
5
explanation:
length of s = 8 sorting s = aabbbbcd arr[0] = has 9 characters i.e more than s length so ignored arr[1] = has 7 characters i.e less than s length so ignored arr[2] = sorting : aabbbbdx. replace x with c and rearranging it makes this as aabbbbcd arr[3] = sorting : aabbbbbd. replace 1 occurrence of b with c and rearranging it makes this as aabbbbcd arr[4] = sorting : aacccccd. replace 4 occurrences of c with b and rearranging it makes this as aabbbbcd arr[5] = sorting : bbbbcddd. replace 2 occurrences of d with a and rearranging it makes this as aabbbbcd arr[6] = sorting : bbbbcdee. replace e with a and rearranging it makes this as aabbbbcd so arr[2], arr[3], arr[4], arr[5], arr[6] matches the given requirement so output is 5.
I tried this program but this fails for some inputs:
static int process(String s, String[] arr) { int matches = 0; Map<Character, Integer> m = new HashMap<>(); // sort s char[] c = s.toCharArray(); Arrays.sort(c); s = new String(c); c = s.toCharArray(); // get each char of s and count its occurrences for(char k : c) { m.put(k, m.getOrDefault(k, 0)+1); } for(String s1 : arr) { // get array element char[] c1 = s1.toCharArray(); // check if array element length matches with input string length if(c1.length == c.length) { // count each occurrence of char into array of alphabets int[] chars = new int[26]; for(char k1: c1) { chars[k1-'a']++; } // decrement count by checking with map for(char k : m.keySet()) { chars[k-'a'] -= m.get(k); } boolean f1 = false; boolean valid = true; int mismatch = 0; int notzeros = 0; // get each element from array of chars for(int i=0; i<26; i++) { int ch = chars[i]; // value not zero if(ch != 0) { // count number of non zeros notzeros++; // f1 is true, means its second occurrence of non zero element if(f1) { if(ch > 0) { // check if values do not match if(mismatch*-1 != ch) { valid = false; break; } } else { // check if values do not match if(mismatch != ch*-1) { valid = false; break; } } } // get the mismatch count and set the value of flag to true f1 = true; mismatch = ch; } // if non zero elements more than 2 then we can ignore this array element if(notzeros > 2) { valid = false; break; } } // check for possible solution. if(valid && f1) { matches++; } } } return matches; }
This program works for the given test case.
Now if I send the below input it fails.
example: s = abba arr = {'aadd" ,"abbb"}; expected output: 1 explanation: sorted s = aabb arr[0] = aadd, replace d with b then we get aabb arr[1] = abbb, we cannot replace all occurrences of a single character to get s as output, so ignored. So the output is 1. But my program is printing 2 which is not correct.
My approach to solve this task is not correct, what is the correct way to do this?
https://stackoverflow.com/questions/65711151/count-number-of-matching-strings-after-replacing-a-character-and-all-its-occurre January 14, 2021 at 07:13AM
没有评论:
发表评论