给定一个组成单词句子的字符数组,请给出一种有效的算法来反转单词(不是字符)在其中的顺序。
输入和输出示例:
>>> reverse_words("this is a string") 'string a is this'
应该是O(N)时间和O(1)空间(split()并且不允许压入/弹出堆栈)。
split()
难题是从这里拿走的。
C / C ++中的解决方案:
void swap(char* str, int i, int j){ char t = str[i]; str[i] = str[j]; str[j] = t; } void reverse_string(char* str, int length){ for(int i=0; i<length/2; i++){ swap(str, i, length-i-1); } } void reverse_words(char* str){ int l = strlen(str); //Reverse string reverse_string(str,strlen(str)); int p=0; //Find word boundaries and reverse word by word for(int i=0; i<l; i++){ if(str[i] == ' '){ reverse_string(&str[p], i-p); p=i+1; } } //Finally reverse the last word. reverse_string(&str[p], l-p); }
时间应为O(n),空间应为O(1)。
编辑:清理了一下。
字符串的第一遍显然是O(n / 2)= O(n)。第二遍是O(n +所有单词的总长度/ 2)= O(n + n / 2)= O(n),这使其成为O(n)算法。