反转字符数组中单词的顺序
Reversing the order of words in a character array
问题是特殊字符(例如:"?"、"、"、"、".")的位置应保持不变。因此,对于输入字符串"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;
}
}
注意:您必须创建自己的简单单词迭代器才能使此逻辑工作,但这很容易实现。
- 文本文件中的单词链表
- 反转字符串中单词的位置,而不更改 O(1) 空格限制中特殊字符的顺序
- 尝试在 c++ 中按字母顺序排列单词时出现分段错误
- 从单词c 的顺序消除元音
- 句子中的单词顺序相反
- 基于广告顺序重复次数最多的单词
- 字符串中单词的反向顺序
- 您如何扭转字符串中单词(而不是字母)的顺序
- 如何通过递归反转字符串中单词的顺序
- 按字母顺序排列单词
- 字符串中单词的相反顺序
- C++程序(按字母顺序打印出n个单词)运行时错误
- 通过递归以相反的顺序打印出一行中的单词
- 反转字符数组中单词的顺序
- 为什么我的ifstream程序以错误的顺序读取单词
- 反转句子中单词的顺序
- 从输入中读取单词序列。使用"Quit"终止,按输入顺序打印,不要打印两次单词。
- 将单词转换为字母的字母顺序值
- c++:我试图颠倒字符串中单词的顺序(而不是整个字符串)
- c++查找首尾字母相同的单词,并按字母顺序对它们进行排序