句子中每个单词的反转字符

时间:2014-05-22 09:51:11

标签: string algorithm big-o time-complexity space-complexity

句子中每个单词的反转字符。例如:

  

我的名字是亚历克斯

更改为

  

yM eman si xela

我想到了正常的O(n)时间算法,使用两个指针指向单词的任一端并将其反转。

但在以下网站

http://www.businessinsider.com/8-mind-bending-interview-questions-that-google-asks-its-engineers-2012-7?op=1

(参见问题2的回答) 将它转换为链表并重复应用单个字的链表反转更好。我在Hackerearth的相同程序中找到了以下解决方案:

http://learn.hackerearth.com/question/317/reverse-characters-of-each-word-in-a-sentence/

此解决方案需要O(n)时间和O(n)空间。我建议的解决方案需要O(n)时间O(1)空间。第二个怎么样更好?

以下是Hackerearth的代码:

public node stringReverseChars(node ll){
    if(ll == null || ll.next == null)
        return ll;
    node tmp = ll;
    node head = null, prev = null;
    while(tmp != null){
        while(tmp != null && tmp.data == ' '){
            if(head == null)
                head = tmp;
            prev = tmp;
            tmp = tmp.next;
        }
        if(tmp == null)
            break;
        node curr = tmp;
        while(tmp.next != null && tmp.next.data != ' '){
            tmp = tmp.next;
        }
        node np = tmp.next;
        tmp.next = null;
        node rev = reverseLL(curr);
        if(prev != null)
            prev.next = rev;
        prev = curr;
        curr.next = np;
        if(head == null)
            head = rev;
        tmp = np;
    }
    return head;
}

1 个答案:

答案 0 :(得分:2)

我非常怀疑其他方法更好。它们的内存使用率更低(Θ(n)对O(1))和更糟的引用位置(它们使用链表而不是数组)。我认为你的解决方案没有任何问题;事实上,我认为这是执行此操作的标准方法。

希望这有帮助!