String Compression(C++壓縮字符串)

解題思路:

(1)既然要使用原地算法,那麼這裏設置三個指針i,start,end

(2)i表示當前字符串的位置,start表示目標字符串的末尾,end用來判斷連續相等字符的迭代

class Solution {
public:
    int compress(vector<char>& chars) {
        int i=0,start=0,end,count;
        string str;
        while(i<chars.size()) {
	    if(i+1<chars.size()) {
		if(chars[i]!=chars[i+1]) {
		    chars[start]=chars[i];
		    i++;
		    start++;
		}
		else {
		    chars[start]=chars[i];
		    end = i+1;
		    count = 1;
		    while(end<chars.size()&&chars[i]==chars[end]) {
			end++;
			count++;
		    }
		    str = to_string(count);
		    for(auto&& c:str) chars[++start]=c;
		    i=end;
		    start++;
                }
	    } else {
		chars[start]=chars[i];
		i++;
		start++;
	    }
	}
	//chars.erase(chars.begin()+start,chars.end());
	//return chars.size()
	return start;
    }
};

(3)LintCode

class Solution {
public:
    /**
     * @param originalString: a string
     * @return: a compressed string
     */
    string compress(string &chars) {
        int i=0,end,count;
        string str="";
        while(i<chars.length()) {
	    if(i+1<chars.length()) {
		if(chars[i]!=chars[i+1]) {
		    str = str + chars[i];
		    str = str + '1';
		    i++;
		}
                else {
		    str = str + chars[i];
		    end = i+1;
		    count = 1;
		    while(end<chars.length()&&chars[i]==chars[end]) {
			end++;
			count++;
		    }
		    str = str + to_string(count);
		    i=end;
		}
	    } else {
		str = str + chars[i];
		if(i!=chars.length()-1) str = str + '1';
		i++;
	    }
	}
	return str.length()<chars.length()?str:chars;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章