Удалить соседние повторяющиеся символы в строке (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
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сregexstring 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