反转字符数组中单词的顺序

Reversing the order of words in a character array

本文关键字:单词 顺序 数组 字符      更新时间:2023-10-16

问题是特殊字符(例如:"?"、"、"、"、".")的位置应保持不变。因此,对于输入字符串"Hello World,how are you?",输出将是"you are,how World Hello?"。现在,对于没有特殊字符的字符串,O(n)算法是反转每个单词,然后反转整个数组,但这没有考虑特殊字符。

我想出的最好的算法如下。我们遍历数组,将每个字推到堆栈顶部,然后将特殊字符排入队列。稍后,我们同时从堆栈和队列中弹出元素,并将它们连接起来以形成所需的输出。

是否有一个现成的O(n)算法?如果没有,你能建议一个没有额外空间的O(n^2)算法吗。还假设您不能使用任何字符串库函数。

所以,这里有一个想法。

1) 初始字符串

"Hello World, how are you?"

2) 反转字符串,但不包括任何最后的特殊字符

"uoy era woh ,dlroW olleH?"

3) 反转字符串中的单词

"you are how ,World Hello?"

4) 创建一个迭代器(指针、索引,无论你用什么)到字符串的开头和结尾,递增/去递增每个迭代器,直到它们碰到非单词。我所说的非单词是指空白或特殊字符。因此,在这种情况下,递增迭代器首先会遇到"you"answers"are"之间的空白,而递减迭代器会遇到"world"answers"Hello"之间的空格,如下所示。

"you are how ,World Hello?"
    ^              ^

5) 如果没有特殊字符,请继续,如果您碰到了特殊字符。反转迭代器之间的所有内容,包括它们所指向的字符

"you are how ,World Hello?"
        ^    ^

6) 现在我们看到了扭转这一局面的结果。

"you are, woh World Hello?"

根据johnchen902 的评论进行编辑

7) 现在,在这些迭代器之间反转子字符串,排除步骤(5)中发现的特殊字符。

"you are, how World Hello?"

8) 返回到步骤(5)。

我还没有对此进行编码,解释起来有点棘手,但我希望您理解

对于就地算法,只需创建两个迭代器(对单词进行迭代),一个反向迭代器,另一个向前。

您的循环将简单地由以下内容组成:

while(FirstIteratorIsBefore(forward_iterator, backward_iterator)) {
  if(IsSpecialCharacter(*forward_iterator)) {
    ++forward_iterator;
  } else if(IsSpecialCharacter(*backward_iterator)) {
    ++backward_iterator;
  } else {
    // Swap the two
    Swap(forward_iterator, backward_iterator);
    ++forward_iterator;
    ++backward_iterator;
  }
}

注意:您必须创建自己的简单单词迭代器才能使此逻辑工作,但这很容易实现。