уменьшить длину строки, когда у нее есть пара в Java - PullRequest
1 голос
/ 17 марта 2019

здесь выдается ошибка ---- обязательная переменная, найденное значение мой код , например, для aabacc, когда мы получили любую пару, такую ​​как aa, удалили ее из строки иокончательный ответ (ba).

открытый класс Решение {

// Complete the superReducedString function below.
static String superReducedString(String s) {
    String sn;
    int j=0;
    for(int i=0;i<s.length()-1;i++)
    {
        if(s.charAt(i)!=s.charAt(i+1))
        {
            sn.charAt(j)=s.charAt(i);                           
            j++;
        }
    }
    return sn;
}

Ответы [ 4 ]

1 голос
/ 17 марта 2019

Поскольку String является неизменяемым в Java, при обработке строк всегда создается новая строка, оставляя предыдущие строки в пуле строк. StringBuffer и StringBuilder являются изменяемыми объектами и предоставляют методы для работы со строками

Пример метода работы с использованием StringBuilder приведен ниже:

static String superReducedString(String s) {
    StringBuilder myName = new StringBuilder(s);
    int j=0;
    for(int i=0;i<s.length()-1;i++) {
        if(s.charAt(i)!=s.charAt(i+1)) {
            myName.setCharAt(j, s.charAt(i));                           
            j++;
        }
    }
    return myName.toString();
}
0 голосов
/ 17 марта 2019

Просто еще одно решение, если другие ответы вам не подходят:

static String superReducedString(String s) {
    char[] chars = s.toCharArray();
    String lastChar = "";
    ArrayList<String> newString = new ArrayList<>();
    for (char aChar : chars) {
        String currentChar = String.valueOf(aChar);
        if (lastChar.equals(currentChar))
            newString.remove(newString.size() - 1);
        else {
            newString.add(currentChar);
            lastChar = currentChar;
        }
    }

    AtomicReference<String> returnString = new AtomicReference<>("");
    newString.forEach(character-> returnString.set(returnString + character));
    return returnString.get();
}
0 голосов
/ 17 марта 2019

Ответ довольно прост.вы не можете ничего удалить из строки, но вы можете переместить их в другую String, как хотите.

public class Solution {

    public static void main(String[] args) {

        String s = "abbccd", s1 = "";

        if(s.charAt(1) != s.charAt(0))
            s1 += s.charAt(0);
        if(s.charAt(s.length()-1) != s.charAt(s.length()-2))
            s1 += s.charAt(s.length()-1);

        for (int i = 1; i < s.length() - 1; i++) {
            if (s.charAt(i) != s.charAt(i - 1) && s.charAt(i) != s.charAt(i + 1))
                s1 += s.charAt(i);
        }
        System.out.println(s1);
    }

}

Вы создаете другую строку.Затем в цикле for, который повторяется от 1 (NOT 0) до s.length()-1 (NOT s.length()), вы проверяете, равен ли s.charAt(i) (текущий символ) предыдущему или следующему.Если он не равен ни одному из них, вы добавляете его ко второму String и затем печатаете его.Мы проверяем обе стороны, поэтому цикл имеет значение от 1 до s.length()-1, чтобы избежать исключений за пределами границ.

РЕДАКТИРОВАТЬ: для проверки первого и последнего символа.

0 голосов
/ 17 марта 2019

Вы не можете выполнять такое присваивание, как sn.charAt(j)=s.charAt(i);, поскольку charAt() - это функция, которая возвращает результат, но не переменная.Вы можете использовать StringBuilder здесь:

static String superReducedString(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if (s.length() == i+1 || s.charAt(i) != s.charAt(i + 1)) {
            sb.append(s.charAt(i));
        } else {
            i++;
        }
    }
    return sb.toString();
}

s.length() == i+1 проверяет, является ли это последним символом.В случае aabaccr результат будет таким, как ожидалось bar

...