题解 | #移动字母#
移动字母
http://www.nowcoder.com/practice/1e5655d7c7be4566b386eb925afcb206
题意:
给你一个只包含小写字母的字符串,现在要将字符串中的字符 全部移动到字符串末尾,其他字符保持原来的相对顺序不变,求变化后的字符串。
解法1(按照题意模拟,不可AC):
前置知识:STL之string的使用
按照题意模拟:从左到右扫描过去,遇到字符 就将其 从当前位置 删除并且追加到字符串末尾。
例如:
遇到字符时
将其删除并且移动到最末尾,指针向前移动
class Solution { public: string change(string s) { int idx=0; int r=s.size();//循环右边界 while(idx<r){ if(s[idx]=='a'){ s.erase(idx,1);//删除 s.push_back('a'); r--;//将字符a追加到末尾,这个字符a就不需要考虑了,右边界向左移动 }else{ idx++;//指针向右移动 } } return s; } };
时间复杂度:对于删除操作,单次操作需要把后面所有字符都向左移动,单次操作的时间复杂度是 的,最坏情况需要做 次的删除操作,而单次追加操作是O(1)的,故总的时间复杂度是 的。
空间复杂度:没有开额外的空间,故空间复杂度为
解法2(优化模拟,可AC):
既然单次追加操作是 的,那么如果我们可以把删除操作转换为追加操作,那么就可以做到线性复杂度了。
具体的,我们可以开两个字符串 和 ,当遇到字符 就往 后面追加,当遇到其它字符就往 后面追加,最后 就是答案。
例如:
最后答案就是:
代码: class Solution { public: string change(string s) { string s1,s2; for(int i=0;i<s.size();i++){ if(s[i]=='a')s1.push_back('a'); else s2.push_back(s[i]); } return s2+s1;//此处是拼接 } };
时间复杂度: ,由于单次追加操作是 的,我们进行了 次的追加操作,故总的时间复杂度为
空间复杂度: , 和 都是 级别大小的,故空间复杂度为