Leetcode 833: замена строки зависит от нумерации индекса - PullRequest
0 голосов
/ 01 января 2019

Доступ к значению индекса строки Этот вопрос является частью моего предыдущего вопроса.

Пример 1: Ввод: S = "abcd", indexes = [0,2], sources = ["a","cd"], target = ["eee","ffff"] Вывод: eeebffff Объяснение: a начинается с индекса 0 в S, поэтому его заменяют на eee.cd начинается с индекса 2 в S, поэтому он заменяется на ffff.

Пример 2: Ввод: S = "abcd", индексы = [0,2], источники = ["ab","ec"], цели = ["eee","ffff"] Вывод: "eeecd" Объяснение: "ab" начинается с индекса 0 в S, поэтому оно заменяется на "eee"."ec" не начинается с индекса 2 в исходном S, поэтому мы ничего не делаем.

public class Q833 {
public static void main(String args[]){
    String S="abcd";
    int[] indexes  = {0, 2};
    String[]sources={"ab","cd"};
    String[] targets = {"eee", "ffff"};
    Solve833 ob833=new Solve833();
    System.out.println(ob833.findReplaceString(S,indexes,sources,targets));
}
}
 class Solve833{
 public String findReplaceString(String S, int[] indexes, String[] sources, String[] targets) {
    char[] array = S.toCharArray();
    StringBuilder result = new StringBuilder();
    int counter = 0;
    String s = "";
    for (String n:sources)
        s+= n;
    char[] c = s.toCharArray();

    for (int i = 0; i < array.length; i++) {
        if(array[indexes[counter]]==c[counter]){
            result.append(targets[counter]);
            if(counter<=indexes.length) {
                counter++;
            }

        }
        else
            result.append(array[i]);
    }


    return result.toString();
}

}

Вывод кода: для 1-го примера

Ожидаемый вывод: Output: "eeebffff".

Мой вывод:

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 2 в Leetcode.Solve833.findReplaceString (Q833.java: 30) в Leetcode.Q833.main (Q833.java:16)

Вывод кода: 2-й пример

Ожидаемый вывод: "eeecd"

Мой вывод: eeebcd.Так что здесь ab отсутствует.Как я могу справиться с этим?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Ваша проблема в том, что вы НЕ должны делать array[indexes[counter]]==c[counter], чтобы определить, что если исходная строка i-th представлена ​​в S по индексу i.Ваш juegement проверяет только первый символ исходной строки.

Ключ этой проблемы в том, как мы можем правильно найти индекс, например, когда мы пытаемся получить результат, индекс (где заменитьисходная строка с целевой строкой) может измениться.

попробуйте этот код:

  public String findReplaceString(String S, int[] indexes, String[] sources, String[] targets) {
        StringBuilder sb=new StringBuilder(S);
        int[] offsets=new int[indexes.length];

        for(int i=0;i<indexes.length;i++){

            if(S.substring(indexes[i],indexes[i]+sources[i].length()).equals(sources[i])){
                int offset=0;
                for(int j=0;j<i;j++){
                    if(indexes[j]<indexes[i])
                    offset+=offsets[j];
                }
                sb.replace(indexes[i]+offset,indexes[i]+sources[i].length()+offset,targets[i]);
                offsets[i]=targets[i].length()-sources[i].length();

            }
        }

        return sb.toString();
    }
0 голосов
/ 01 января 2019

Вы можете изменить свой метод, как этот, чтобы напечатать результат,

public class Q833 {
    public static void main(String args[]) {
        String S = "abcd";
        int[] indexes = {0, 2};
        String[] sources = {"a", "cd"};
        String[] targets = {"eee", "ffff"};
        Solve833 ob833 = new Solve833();
        System.out.println(ob833.findReplaceString(S, indexes, sources, targets));
    }
}

class Solve833 {
    public String findReplaceString(String S, int[] indexes, String[] sources, String[] targets) {
        StringBuffer result = new StringBuffer(S);
        for (int i = 0; i < indexes.length; i++) {
            if (sources[i].equals(result.substring(indexes[i], indexes[i] + sources[i].length()))) {
                result.replace(indexes[i], indexes[i] + sources[i].length(), targets[i]);
                if (i < indexes.length - 1)
                    indexes[i + 1] = indexes[i + 1] + targets[i].length() - sources[i].length();
            }
        }
        return result.toString();
    }
}
...