我有一个字符串,想要反转它,以便某些字符反转,而其他字符保持不变。我怎样才能实现这一点(例如,假设我希望所有数字在所有数字保持原位时都反转)?
答案 0 :(得分:4)
您可以为它创建自动机:
迭代字符串,将每个字母插入堆栈并用一个不在原始字符串中的特殊字符(即$)替换它,不要改变数字。
再次遍历字符串,将每个$替换为堆栈的头部。
注意:由于String是不可变的,因此您需要先将其导出到StringBuilder或CharSequence
的修改
例如:
String inp = "a45string1test";
char[] cs = new char[inp.length()];
inp.getChars(0, inp.length(), cs, 0);
Stack<Character> stack = new Stack<Character>();
for (int i =0;i<cs.length;i++) {
if (Character.isDigit(cs[i])) continue;
stack.push(cs[i]);
cs[i] = '$';
}
for (int i=0;i<cs.length;i++) {
if (cs[i] == '$') cs[i] = stack.pop();
}
System.out.println(cs);
结果将为t45setgni1rtsa
复杂性是O(n):迭代字符串(两次) - 因为所有堆栈操作都是O(1)。
答案 1 :(得分:4)
听起来你想要像myReverse(“a1b2c3d”)这样的东西是“d1c2b3a”。
使用两个索引,一个从字符串的每一端开始,寻找可交换的字符。
这是一些伪代码:
i1 = 0; i2 = len - 1;
while (i1 < i2) {
while (isCharacterThatShouldNotBeSwapped(str.charAt(i1)) && i1 < i2)
i1++;
while (isCharacterThatShouldNotBeSwapped(str.charAt(i2)) && i1 < i2)
i2--;
if (i1 < i2)
swapChars(str, i1, i2); /* swap characters at positions i1 and i2 in str */
i1++; i2--;
}