我的代码没有给出预期的输出,但是干运行正常。请看一下问题在哪里
public static StringBuffer singleOccurence(String s)
{
StringBuffer sb = new StringBuffer(s);
int length=s.length();
for(int i=0; i< length ; i++)
{
for(int j=i; i<length&&j<length ; j++)
{
if(sb.charAt(i)!=sb.charAt(j+1))
i=j+1;
else
sb.deleteCharAt(j+1);
}
}
return sb;
}
还提供StringIndexOutOfBounds
答案 0 :(得分:4)
我会使用正则表达式:
String input = "aaaabbbccdbbaae";
String regex = "(.)(\\1)+"; // matches any character followed by the same one(s)
String output = input.replaceAll(regex, "$1");
System.out.println(output); // abcdbae
你的方法是:
public static String singleOccurence(String s) {
return s.replaceAll("(.)(\\1)+", "$1");
}
答案 1 :(得分:4)
你的方法正在做很多不必要的工作。
问题可以通过迭代字符串一次并将每个字符与之前的字符进行比较来解决:
public static StringBuilder singleOccurence(String s)
{
StringBuilder sb = new StringBuilder();
if (s.length() > 0) {
char prev = s.charAt(0);
sb.append(prev);
for (int i = 1; i < s.length(); ++i) {
char cur = s.charAt(i);
if (cur != prev) {
sb.append(cur);
prev = cur;
}
}
}
return sb;
}
此方法具有线性时间复杂度。
答案 2 :(得分:2)
最简单的方法是从一端到另一端遍历字符串:
public static StringBuffer singleOccurence(String s)
{
StringBuffer sb = new StringBuffer(s);
for (int i = sb.length() - 2; i >= 0; i--)
if (sb.charAt(i) == sb.charAt(i + 1))
sb.deleteCharAt(i + 1);
return sb;
}
答案 3 :(得分:1)
听起来像是对我的负面预测:
String input = "aaaaabbbbccccddd";
Pattern p = Pattern.compile("(.)(?!\\1)");
Matcher m = p.matcher(input);
while(m.find()){
System.out.println(m.group(1));
}
答案 4 :(得分:0)
试试这个:
String reg;
String input;
String output;
reg = "(.)(\\1)+";
input = "aaaabbbccdbbaae";
output = input.replaceAll(reg,"$1");
System.out.println("Input :"+input);
System.out.println("Output:"+output);
答案 5 :(得分:0)
您可以将replaceAll
方法与regex
string result = myString.replaceAll(/([a-z])\1+/ig, "$1");
这个regex
做的是它匹配由部分[a-z]
\1+
正则表达式中的标志(在最后一个/
之后)表示它应该搜索整个字符串(g
标志)并且它应该忽略大小写(i
标志) 。您可能不需要g
标记,因为我们正在使用replaceAll
。
在这里,我们将替换为$1
,这意味着替换为第一个匹配的组。
由于我们在[a-z]
附近有括号,$1
将是匹配的字符。
这一切最终意味着,在字符串中找到重复的字符,同时忽略大小写并用该字符替换它们。
答案 6 :(得分:0)
公共类RemoveAdjacentLetters {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter any word: "); // Inputting the word
String str = scanner.nextLine();
for (int i = 1; i < str.length(); i++) { // from 2nd letter
if (str.charAt(i) == str.charAt(i - 1)) { // comparing adjacent
// letters
str = str.substring(0, i - 1) + str.substring(i + 1); // eliminating
// 1st
// duplicates
System.out.println(str);
i = 0; // i=0 because I need to check for all possible adjacent letters..
}
}
if (str.length() == 0) {
System.out.println("Empty String");
}
scanner.close();
}
}
答案 7 :(得分:0)
import java.util.Arrays; import java.util.Scanner;
公共类ReverseSkip {
public static void main(String[] args) {
String str;
Scanner in = new Scanner(System.in);
System.out.println("Enter the Word or Sentence");
str =in.nextLine();
String revStr ="null";
char [] chars = str.toCharArray();
char [] reversedChars = new char[chars.length];
reversedChars[reversedChars.length - 1] = chars[0];
int r = reversedChars.length - 2;
for(int i = 1 ; i < chars.length ; i++ ){
if(chars[i] != chars[i-1]){
reversedChars[r] = chars[i];
r--;
}
}
revStr = new String(Arrays.copyOfRange(reversedChars, r+1, reversedChars.length));
System.out.println(revStr);
}
}
答案 8 :(得分:0)
这在Java中很容易解决。你只需要一个StringBuffer。 这是完整的代码:
public class Test3 {
public static void main(String[] args) {
String str = "aaaabbbccdbbaae";
StringBuffer sbr = new StringBuffer();
int i = 0 ;
while(i < str.length()) {
if(sbr.length() == 0 ) sbr.append(str.charAt(i));
if(str.charAt(i) == sbr.charAt(sbr.length() -1)) {i++ ;}
else {sbr.append(str.charAt(i)); i++;}
}//while
System.out.println(sbr);
}
}//end1
这是Python中的完整解决方案:(不同的想法)
def lis(a):
list1 = []
# put the characters in the list
[list1.append(ch) for ch in a]
print(list1)
# moving backwards from last element i.e.len(a) -1 to first element 0 and step is -1
for i in range(len(list1) - 1 , 0 , -1):
# delete the repeated element
if list1[i] == list1[i - 1]: del list1[i]
return ''.join(list1)
a = "Protiijaayii"
# output Protijayi
print(lis(a))