题解 | #移动字母#

移动字母

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;//此处是拼接
    }
};

时间复杂度:图片说明 ,由于单次追加操作是 图片说明 的,我们进行了图片说明 次的追加操作,故总的时间复杂度为图片说明
空间复杂度:图片说明图片说明图片说明 都是图片说明 级别大小的,故空间复杂度为图片说明

全部评论

相关推荐

牛客618272644号:佬携程工作怎么样,强度大吗
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务