Given a string, remove consecutive duplicate characters from the given string. The output should not have any duplicate characters. For Examples: If the given string is "abcccbd" algorithm should first remove "ccc" and then "bb", so the final string will become "ad". The algorithm should destroy the characters only if there are more than 1 continuous occurrence of same character in the string. This algorithm call Marquez Algorithm.
Examples: Input 1: aabccdee Output: bd Explanation-> Step 1: aabccdee Step 2: bccdee Step 3: bdee Step 4: bd(Final Answer) Input 2: abcdeedcbfgf output: afgf Explanation-> Step 1: abcdeedcbfgf Step 2: abcddcbfgf Step 3: abccbfgf Step 4: abbfgf Step 5: afgf(Final Answer) Input 3: abbabba Output: a Explanation: Step 1: abbabba Step 2: aabba Step 3: bba Step 4:a(Final Answer) Input 4: aa Output: (Empty string) Explanation: Step 1: aa Step 2:
A simple approach would be to run the input string through multiple passes. In every pass remove all the consecutive duplicate characters from left to right. Stop running when pass does not have any duplicate.
Below is java program.
package com.walking.techie.data.structure.string; public class MarquezAlgo { private static int step = 1; public static void main(String[] args) { MarquezAlgo obj = new MarquezAlgo(); String input1 = "aabccdee"; obj.removeConsecutiveCharacters(input1); System.out.println(); step = 1; String input2 = "abcdeedcbfgf"; obj.removeConsecutiveCharacters(input2); System.out.println(); step = 1; String input3 = "abbabba"; obj.removeConsecutiveCharacters(input3); System.out.println(); step = 1; String input4 = "aaaa"; obj.removeConsecutiveCharacters(input4); System.out.println(); step = 1; String input5 = "abcdef"; obj.removeConsecutiveCharacters(input5); } private String removeConsecutiveCharacters(String input) { if (input == null) { return input; } // input size is 1 if (input.length() == 1) { return input; } /* check on every step input contain * adjacent duplicate characters */ while (isValid(input)) { int length = input.length(); //length of input string int firstIndex = 0; boolean findConsecutiveDuplicates = false; int i; //start from the second character for (i = 1; i < length; i++) { // firstIndex will find consecutive duplicate characters from index 0 to i if (input.charAt(i) == input.charAt(i - 1)) { findConsecutiveDuplicates = true; firstIndex = i + 1; } else { // find string then break the for loop if (findConsecutiveDuplicates) { input = input.substring(firstIndex); break; } // find consecutive duplicate characters in between 0 to length-1 int prev = i - 1; StringBuilder sb = new StringBuilder(); while (i < length) { if (!findConsecutiveDuplicates && input.charAt(prev) != input.charAt(i)) { sb.append(input.charAt(prev)); prev = i; } else { findConsecutiveDuplicates = true; if (findConsecutiveDuplicates && input.charAt(prev) != input.charAt(i)) { sb.append(input.substring(i)); break; } } i++; } // if no consecutive duplicate character found, then add the last character of input string if (!findConsecutiveDuplicates) { sb.append(input.charAt(i - 1)); } // assign string back to input input = sb.toString(); break; } } // to handle case like aa, aaaaa if (i == input.length()) { input = input.substring(firstIndex); } } return input; } // This method validates string contain consecutive characters private boolean isValid(String string) { System.out.println("Step " + step++ + " " + string); for (int i = 1; i < string.length(); i++) { if (string.charAt(i - 1) == string.charAt(i)) { return true; } } return false; } }
Output of above program is shown below:
Step 1 aabccdee Step 2 bccdee Step 3 bdee Step 4 bd Step 1 abcdeedcbfgf Step 2 abcddcbfgf Step 3 abccbfgf Step 4 abbfgf Step 5 afgf Step 1 abbabba Step 2 aabba Step 3 bba Step 4 a Step 1 aaaa Step 2 Step 1 abcdef
No comments :
Post a Comment