其他分享
首页 > 其他分享> > 蓝桥杯练习008

蓝桥杯练习008

作者:互联网

蓝桥杯练习008

面试题 01.06. 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

输入:“aabcccccaaa”
输出:“a2b1c5a3”

示例2:

输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。

提示:

字符串长度在[0, 50000]范围内。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/compress-string-lcci

解题思路

传递的参数为要压缩的字符串,可以将字符串的第一个字符先存到cur变量中,并用一个count变量存放当前字符出现的次数,初始化为1次,然后从字符串的第二个位置开始遍历字符串,进行判断。

如果当前的字符cur和字符串的某一个位置上的字符相等,就让count的值加一,如果不相等,就把当前的字符和count的值拼接到字符串变量中,用来保存结果,需要注意的是需要将int类型的变量count用to_string方法转换为字符串类型。

还有需要注意的是:当走到最后的位置时,由于后边没有和最后一个字符进行比较,因此需要在循环结束后把最后那一部分加到结果中。
转换完后,需要对输出进行控制,判断转换后的长度是否小于之前的长度,如果小于,就输出转换后的字符串,否则输出转换之前的字符串。

代码

class Solution {
public:
    string compressString(string S) {
        string ans = "";//保存结果
        char cur = S[0];//用来标记当前字符
        int count = 1;//当前字符的数量
        for (int i = 1; i < S.length(); i++) {//对字符串进行遍历
            if (cur != S[i]) {//当前字符和下一个字符不相等
                ans += cur + to_string(count);//将当前字符和数量保存到结果
                cur = S[i];//将当前字符换成下一个字符
                count = 1;//数量重置为1
            }
            else count++;//当前字符和下一字符相等,数量加一
        }
        ans += cur + to_string(count);//处理最后的一部分
        return ans.length() < S.length() ? ans : S;//按照题目要求返回字符串较短的那一个
    }
};

剑指Offer38.字符串的排列

题目要求

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

限制:

1 <= s 的长度 <= 8

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof

解题思路

代码

class Solution {
public:
    vector<string> ret;//存放结果
    vector<string> permutation(string s) {
        f(s, 0);//从第一个开始找
        return ret;
    }
    //递归求解全排列
    void f(string& s, int startIndex) {
        //退出机制
        if (startIndex == s.length()) {//当到最后时将结果存到ret中
            ret.push_back(s);
            return;
        }
        //从startIndex开始向后遍历
        for (int i = startIndex; i < s.length(); i++) {
            //加一个判断,当之前的首字和现在一样的情况下直接返回
            bool isContinue = true;//标记
            for (int j = startIndex; j < i; j++) {
                if (s[j] == s[i]) {//如果之前出现过就不用交换位置
                    isContinue = false;
                }
            }
            if (!isContinue) continue;//之前出现过这个字母,就不需要交换位置
            swap(s[startIndex], s[i]);//将当前字母和后边字母交换位置求全排列
            f(s, startIndex + 1);//找下一个
            swap(s[startIndex], s[i]);//将之前交换的字母再交换回来
        }
    }
};

标签:count,字符,string,练习,蓝桥,startIndex,字符串,008,cur
来源: https://blog.csdn.net/qq_51302626/article/details/121962817