算法 (Frankwoo说过了)
示例子串: ABCDE FG HIJ k LMO
1. 分别从左右扫描,得到左ABCDE长度为5, 右LMO长度3,对较长者调整,如果等长,调过此步
ABCDE调整成CDEAB, 即把长度为5-3=2的子串从头移到尾,这可以是一个O(1)的动作。笨了一点
如下ABCDE -> ACBDE->ACDBE->ACDEB ->CADEB->CDAEB->CDEAB
没办法,时间换空间了。我怀疑会有这样的现实需要,不过做题嘛,丁是丁卯是卯。
如果给出来每个字的最大长度,允许用一个缓冲区的话,那就不用那么多循环咯,不过时间复杂度还是O(n) n为最大单词长度
经此步,得到 CDEAB FG HIJ k LMO
2. 首尾交换 得到 LMOAB FG HIJ k CDE
3 对从A到C前面的那个空格开始的子串,重复1-2的动作,直到子串中剩下0或1个单词。
需要注意的是空格的处理。如果两个单词间可以用不只一个空格隔开,那空格是前结合还是后结合会影响输出结果,如下例
ABC__DEF_G (_表示空格)
转换结果究竟是应该为G__DEF_ABC还是G_DEF__ABC, 这个需要规定好。
上面的算法可以简单的用循环实现,无须用到递归。空间复杂度为O(1)或O(0) (如果用异或实现swap的话 :-)
示例子串: ABCDE FG HIJ k LMO
1. 分别从左右扫描,得到左ABCDE长度为5, 右LMO长度3,对较长者调整,如果等长,调过此步
ABCDE调整成CDEAB, 即把长度为5-3=2的子串从头移到尾,这可以是一个O(1)的动作。笨了一点
如下ABCDE -> ACBDE->ACDBE->ACDEB ->CADEB->CDAEB->CDEAB
没办法,时间换空间了。我怀疑会有这样的现实需要,不过做题嘛,丁是丁卯是卯。
如果给出来每个字的最大长度,允许用一个缓冲区的话,那就不用那么多循环咯,不过时间复杂度还是O(n) n为最大单词长度
经此步,得到 CDEAB FG HIJ k LMO
2. 首尾交换 得到 LMOAB FG HIJ k CDE
3 对从A到C前面的那个空格开始的子串,重复1-2的动作,直到子串中剩下0或1个单词。
需要注意的是空格的处理。如果两个单词间可以用不只一个空格隔开,那空格是前结合还是后结合会影响输出结果,如下例
ABC__DEF_G (_表示空格)
转换结果究竟是应该为G__DEF_ABC还是G_DEF__ABC, 这个需要规定好。
上面的算法可以简单的用循环实现,无须用到递归。空间复杂度为O(1)或O(0) (如果用异或实现swap的话 :-)