Java Solution for Special String Again HackerRank Probelm
A string is said to be a special string if either of two conditions is met:
- All of the characters are the same, e.g.
aaa
. - All characters except the middle one are the same, e.g.
aadaa
.
A special substring is any substring of a string which meets one of those criteria. Given a string, determine how many special substrings can be formed from it.
Example :
str = mnonopoo
str contains the following 12 special substrings {m, n, o, n, o, p, o, o, non, ono, opo, oo}
See full description :
Lets see solution and its Explanation
Solution 1 :
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 substrCount function below.
static long substrCount(int n, String str) {
for (int i = 0; i < str.length(); i++) {
char iIndexChar = str.charAt(i);
int middleIndexChar = -1;
for (int j = i+1; j < str.length(); j++) {
char jIndexChar = str.charAt(j);
// Check for characters except the middle one are the same and
// All of the characters are the same
if (iIndexChar == jIndexChar) {
if ( (middleIndexChar == -1) || (j - middleIndexChar) == (middleIndexChar - i)) {
n++;
}
} else if (middleIndexChar == -1) {
middleIndexChar = j;
} else {
break;
}
}
}
return n;
}
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 n = scanner.nextInt();
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
String s = scanner.nextLine();
long result = substrCount(n, s);
bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();
bufferedWriter.close();
scanner.close();
}
}
Solution explanation :
- Traverse through given String from 0 to its length and store current ith index character in iIndexChar variable.
- Take int variable and initialize with -1.
- Now again loop through given string from i+1 to string length and store current jth index string in jIndexChar.
- Check if ithIndexChar and jIndexChar are matched or not.
- If middleIndexChar is -1 that means we got consecutive characters (aa, bb). If or condition are matching ((j - middleIndexChar) == (middleIndexChar - i)) that means, we got characters except the middle one are the same. and increment n.
- In else if condition, we are storing jth index into middleIndexChar. or else break second for loop (that means string does not satisfy following condition : All characters except the middle one are the same)
- return n.
Output explanation :
str = asasd, n = 5
- i = 0
- iIndexChar = a, middleIndexChar = -1
- j = 1
- jIndexChar = s
- If Condition : iIndexChar == jIndexChar becomes false
- Else If Condition : middleIndexChar == -1 becomes true | middleIndexChar = 1;
- j = 2, middleIndexChar = 1, n = 5
- jIndexChar = a
- If Condition : a = a becomes true
- (j - middleIndexChar) == (middleIndexChar - i) | 2 - 1 == 1 - 0 becomes true.
- n = 6
- j = 3, middleIndexChar = 1, n = 6
- jIndexChar = s
- If Condition : a == s becomes false
- Else If : middleIndexChar == -1 becomes false
- Else Condition : break second for loop.
- i = 1
- iIndexChar = s, middleIndexChar = -1
- j = 2
- jIndexChar = a
- If Condition : s == a becomes false
- Else If Condition : middleIndexChar == -1 becomes true | middleIndexChar = 2;
- j = 3, middleIndexChar = 2, n = 6
- jIndexChar = s
- If Condition : s = s becomes true
- 3 - 2 == 2 - 1 | 1 == 1 becomes true.
- n = 7
- j = 4, middleIndexChar = 2, n = 7
- jIndexChar =d
- If Condition : s == d becomes false
- Else If : middleIndexChar == -1 becomes false
- Else Condition : break second for loop.
- i = 2
- iIndexChar = a, middleIndexChar = -1
- j = 3
- jIndexChar = s
- If Condition : a == s becomes false
- Else If Condition : middleIndexChar == -1 becomes true | middleIndexChar = 3;
- j = 4, middleIndexChar = 3, n = 7
- jIndexChar = d
- If Condition : s = d becomes false
- Else If : middleIndexChar == -1 becomes false
- Else Condition : break second for loop.
- i = 3
- iIndexChar = a, middleIndexChar = -1
- j = 4
- jIndexChar =d
- If Condition : s == d becomes false
- Else If Condition : middleIndexChar == -1 becomes true | middleIndexChar = 4;
- Second loop ends
- i = 4
- First loop also ends
- Return n | 7
Other HackerRank solutions you may like :
Comments
Post a Comment