Удалить соседние повторяющиеся символы в строке (java) т. е. вход: aaaabbbccdbbaae выход: abcdbae



Мой код не дает ожидаемого результата, но сухой запуск работает нормально.пожалуйста, посмотрите, в чем проблема



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

483   9  

9 ответов:

Ваш метод делает много ненужной работы.

Задача может быть решена путем однократного перебора строки и сравнения каждого символа с предшествующим ему:
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;
}
Этот метод имеет линейную временную сложность.

Я бы использовал регулярное выражение:

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");
}

Самый простой способ-пересечь строку от конца до начала:

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;
}

Звучит очень похоже на негативную внешность для меня:

 String input = "aaaaabbbbccccddd";
    Pattern p = Pattern.compile("(.)(?!\\1)");
    Matcher m = p.matcher(input);

    while(m.find()){
        System.out.println(m.group(1));
    }

Попробуйте это:

    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);

Вы можете использовать метод replaceAll с regex

string result = myString.replaceAll(/([a-z])\1+/ig, "$1");

То, что это regex делает, это то, что он соответствует любому Альфа-символу [a-z], который повторяется, который запускается частью \1+

Флаги в регулярном выражении (после последнего /) указывают, что он должен искать всю строку (флаг g), и он должен игнорировать регистр (флаг i). возможно, Вам не понадобится флаг g, так как здесь мы используем replaceAll.

Здесь мы заменяем на $1, что означает, заменить на первая соответствовала группе. поскольку у нас есть круглые скобки вокруг [a-z], $1 будет совпадающим символом.

Все это в конечном итоге означает, что найти повторяющиеся символы в строке, игнорируя регистр, и заменить их этим символом.

Открытый класс 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();
}

}

Импорт java.утиль.Массивы; импорт java.утиль.Сканер;

Публичный класс 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);
}

}

Это легко решить в Java. Вы просто должны взять шнурок. Это полный код:

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))

Comments

    Ничего не найдено.