Skip to main content

Special String Again HackerRank Solution in Java

Java Solution for Special String Again HackerRank Probelm

Special String Again HackerRank Solution in Java

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

Popular posts from this blog

Queen's Attack II HackerRank Solution in Java with Explanation

Queen's Attack II Problem's Solution in Java (Chessboard Problem)   Problem Description : You will be given a square chess board with one queen and a number of obstacles placed on it. Determine how many squares the queen can attack.  A queen is standing on an n * n chessboard. The chess board's rows are numbered from 1 to n, going from bottom to top. Its columns are numbered from 1 to n, going from left to right. Each square is referenced by a tuple, (r, c), describing the row r and column c, where the square is located. The queen is standing at position (r_q, c_q). In a single move, queen can attack any square in any of the eight directions The queen can move: Horizontally (left, right) Vertically (up, down) Diagonally (four directions: up-left, up-right, down-left, down-right) The queen can move any number of squares in any of these directions, but it cannot move through obstacles. Input Format : n : The size of the chessboard ( n x n ). k : The number of obstacles...

Simple Text Editor HackerRank Solution in Java with Explanation

Simple Text Editor HackerRank Solution in Java with Explanation Problem Description : Implement a simple text editor. The editor initially contains an empty string S. Perform Q operations of the following 4 types: append (W) - Append string W to the end of S. delete (k) - Delete the last K characters of S. print (k) - Print the kth character of S. undo () - Undo the last (not previously undone) operation of type 1 or 2, reverting S to the state it was in prior to that operation. Example : Input : S = "abcde" Operations = ["1 fg", "3 6", "2 5", "4", "3 7", "4", "3 4"] index   S          ops[index]    explanation -----   ------     ----------    ----------- 0       abcde      1 fg          append fg 1       abcdefg    3 6        ...