[英]How to remove adjacent duplicates in a string in Java
I've been looking for this answer for a while. 我一直在寻找这个答案一段时间。 I've found numbers of solutions for removing duplicates using a HashSet or LinkedHashSet but they all remove all duplicates, I'm looking for only the adjacent ones. 我已经找到了许多使用HashSet或LinkedHashSet删除重复项的解决方案,但它们都删除了所有重复项,我只在寻找相邻的重复项。 " Say a string is "ABBCDAABBBBBBBBOR" The required result should be "ABCDABOR" and not "ABCDOR". Could this be achived in O(n) ? Thanks. “说一个字符串是“ ABBCDAABBBBBBBBBBOR”所需的结果应该是“ ABCDABOR”而不是“ ABCDOR”。能否在O(n)中实现?谢谢。
Sure: 当然:
StringBuilder sb = new StringBuilder();
char[] chars = text.toCharArray();
char previous = chars[0];
sb.append(chars[0]);
for(int i = 1 ; i < chars.length ; i++) {
if(chars[i] != previous) {
sb.append(chars[i]);
previous = chars[i];
}
}
String res = sb.toString();
O(n) time solution : O(n)时间解:
public String removeAdjacentDuplicates(String s) {
StringBuilder resultBuilder = new StringBuilder();
char previous = s.charAt(0);
resultBuilder.append(previous);
for (int i = 1; i < s.length(); i++) {
char current = s.charAt(i);
if (previous != current) {
resultBuilder.append(current);
previous = current;
}
}
return resultBuilder.toString();
}
I'm just starting to work with streams so bear with me... 我才刚刚开始使用流媒体,所以请多多包涵...
public static String removeAdjacentDuplicates(String input) {
if (input.length() <= 1) {
return input;
}
StringBuilder sb = new StringBuilder();
sb.append(input.charAt(0));
IntStream.range(1, input.length())
.mapToObj(i -> input.charAt(i) != input.charAt(i - 1) ? input.charAt(i) : "")
.forEach(sb::append);
return sb.toString();
}
or if this more your style instead of the StringBuilder: 或者,如果这更适合您的样式,而不是StringBuilder:
return input.charAt(0) + String.join("",
IntStream.range(1, input.length())
.mapToObj(i -> input.charAt(i) != input.charAt(i - 1) ?
String.valueOf(input.charAt(i)) : "")
.toArray(size -> new String[size]));
This is a complete solution using Java. 这是使用Java的完整解决方案。
public class Occurence2 {
public static void main(String[] args) {
// String a = "ABBCDAABBBBBBBBOR"; //ABCDABOR
String a = "GiiinnnniiiiiGinnnaPrrooottijayyyi";//GiniGinaProtijayi
fix(a);
}// amin
private static void fix(String a) {
StringBuffer sbr = new StringBuffer();
for (int i = 0; i < a.length(); i++) {
char ch = a.charAt(i);
if (sbr.length() == 0) {
sbr.append(ch);
}
if (ch == sbr.charAt(sbr.length() - 1)) {
i++;
} else {
sbr.append(ch);
}
}
System.out.println(sbr);
}// fiix
}
If you don't want to use StringBuffer, then you can simply use an empty string. 如果您不想使用StringBuffer,则可以只使用一个空字符串。
public class Test6 {
public static void main(String[] args) {
String a = "GiiinnnniiiiiGinnnaPrrooottijayyyi";
fix(a);
}
private static void fix(String a) {
String res = "";
int i = 0 ;
while(i < a.length()) {
char ch = a.charAt(i);
if(res.length() == 0 ) {res += ch ;}
if(ch == res.charAt(res.length() -1)) {i++ ;}
if(ch != res.charAt(res.length() -1)) {res += ch ;}
}//while
System.out.println(res);
}//fix
}
The solution in Python: Python解决方案:
a = "GiniiiiGinaaaPrrrottiijayi"
reslist =[]
for ch in a:
if(len(reslist) == 0 or ch != reslist[-1]):reslist.append(ch)
print(reslist)
print(''.join(reslist))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.