在保持一些位置的同时反转Java中的字符

时间:2011-04-17 08:32:47

标签: java string

我有一个字符串,想要反转它,以便某些字符反转,而其他字符保持不变。我怎样才能实现这一点(例如,假设我希望所有数字在所有数字保持原位时都反转)?

2 个答案:

答案 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--;
}