Leetcode 833:字符串替换取决于索引编号
Leetcode 833: String replacement depend upon index numbering
这个问题是我上一个问题的一部分。
示例 1:
输入:S = "abcd"
, indexes = [0,2]
, sources = ["a","cd"]
, targets = ["eee","ffff"]
输出:eeebffff
解释:a
从 S 中的索引 0 开始,因此它被 eee
替换。
cd
从 S 中的索引 2 开始,因此它被替换为 ffff
。
示例 2:
输入:S = "abcd"
, indexes = [0,2]
, sources = ["ab","ec"]
, targets = ["eee","ffff"]
输出:"eeecd"
解释:"ab"
从 S 中的索引 0 开始,因此它被 "eee"
取代。
"ec"
不是从原始 S 中的索引 2 开始,所以我们什么都不做。
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();
}
}
代码输出:第一个例子
预期输出:Output: "eeebffff"
。
我的输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at Leetcode.Solve833.findReplaceString(Q833.java:30) at
Leetcode.Q833.main(Q833.java:16)
代码Output:2nd示例
预期输出:"eeecd"
我的输出:eeebcd
。所以这里 a b 不见了。我该如何处理?
您可以像这样更改方法来打印结果,
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();
}
}
你的问题是你不应该 array[indexes[counter]]==c[counter]
来确定 i-th
源字符串是否出现在索引 i
的 S
中。您的判断只检查源字符串的第一个字符。
这个问题的关键是我们如何才能正确找到索引,因为当我们试图得到结果时,索引(在何处用目标字符串替换源字符串)可能会改变。
试试这个代码:
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();
}
示例 1:
输入:S = "abcd"
, indexes = [0,2]
, sources = ["a","cd"]
, targets = ["eee","ffff"]
输出:eeebffff
解释:a
从 S 中的索引 0 开始,因此它被 eee
替换。
cd
从 S 中的索引 2 开始,因此它被替换为 ffff
。
示例 2:
输入:S = "abcd"
, indexes = [0,2]
, sources = ["ab","ec"]
, targets = ["eee","ffff"]
输出:"eeecd"
解释:"ab"
从 S 中的索引 0 开始,因此它被 "eee"
取代。
"ec"
不是从原始 S 中的索引 2 开始,所以我们什么都不做。
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();
}
}
代码输出:第一个例子
预期输出:Output: "eeebffff"
。
我的输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Leetcode.Solve833.findReplaceString(Q833.java:30) at Leetcode.Q833.main(Q833.java:16)
代码Output:2nd示例
预期输出:"eeecd"
我的输出:eeebcd
。所以这里 a b 不见了。我该如何处理?
您可以像这样更改方法来打印结果,
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();
}
}
你的问题是你不应该 array[indexes[counter]]==c[counter]
来确定 i-th
源字符串是否出现在索引 i
的 S
中。您的判断只检查源字符串的第一个字符。
这个问题的关键是我们如何才能正确找到索引,因为当我们试图得到结果时,索引(在何处用目标字符串替换源字符串)可能会改变。
试试这个代码:
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();
}