1、仅仅翻转字母

力扣链接
代码1展示:【下标】


class Solution {
bool isLetter(const char& c)
{
    if (c >= 'a' && c <= 'z')
        return true;
    else if (c >= 'A' && c <= 'Z')
        return true;
    else
        return false;
}
public:
    string reverseOnlyLetters(string s)
    {
        int left = 0;
        int right = s.size() - 1;
        while (left < right)
        {
            while (left < right && !isLetter(s[left]))
            {
                left++;
            }
            while (left < right && !isLetter(s[right]))
            {
                right--;
            }
            swap(s[left], s[right]);
            ++left;
            --right;
        }        
        return s;
    }
};

代码2展示:【迭代器】

class Solution {
bool isLetter(const char& c)
{
    if (c >= 'a' && c <= 'z')
        return true;
    else if (c >= 'A' && c <= 'Z')
        return true;
    else
        return false;
}
public:
    string reverseOnlyLetters(string s)
    {
        string::iterator leftIt = s.begin();
        string::iterator rightIt = s.end() - 1;
        while (leftIt < rightIt)
        {
            while (leftIt < rightIt && !isLetter(*leftIt))
            {
                leftIt++;
            }
            while (leftIt < rightIt && !isLetter(*rightIt))
            {
                rightIt--;
            }
            swap(*leftIt, *rightIt);
            ++leftIt;
            --rightIt;
        }        
        return s;
    }
};

思路:快速排序中的单趟排序

知识点:C++库提供了swap的函数,可以直接调用。

2、字符串中的第一个唯一字符

力扣链接
代码展示

class Solution {
public:
    int firstUniqChar(string s) 
    {
        int count[26] = { 0 };
        for (auto ch : s)
        {
            count[ch - 'a']++;
        }
        for (size_t i = 0; i < s.size(); i++)
        {
            if (count[s[i] - 'a'] == 1)
            {
                return i;
            }
        }
        return -1;

    }
};

思路:计数排序的思想

3、字符串里最后一个单词的长度

牛客链接
代码展示

#include <iostream>
using namespace std;

int main()
{
    string s;
    getline(cin, s);
    size_t pos = s.rfind(' ');
    if (pos != string::npos)
    {
        cout << s.size() - (pos + 1);
    }
    else 
    {
        cout << s.size();
    }
    return 0;
}

思路:首先得到倒数第一个空格的下标,然后size进行减去(下标+1)

知识点:cin遇见空格会认为获取结束,当遇见一行字符串的时候,该字符串中间有空格,那么就不会获取到整行的字符串。getline会获取一行的字符串,遇到空格也不会认为获取终止。

4、验证一个字符串是否是回文

力扣链接
代码展示

class Solution {
public:
    bool isLetterOrNumber(char ch)
    {
        return (ch >= '0' && ch <= '9')
            || (ch >= 'a' && ch <= 'z')
            || (ch >= 'A' && ch <= 'Z');
    }

    bool isPalindrome(string s) 
    {

        //小写换成大写
        for(auto& ch : s)
        {
            if (ch >= 'a' && ch <= 'z')
            {
                ch -= 32;
            }
        }

        int begin = 0;
        int end = s. size() - 1;
        while (begin < end)
        {
            while(begin < end && !isLetterOrNumber(s[begin]))
            {
                ++begin;
            }
            while(begin < end && !isLetterOrNumber(s[end]))
            {
                --end;
            }

            if(s[begin] != s[end])
            {
                return false;
            }
            else
            {
                ++begin;
                --end;
            }
        }
        return true;
    }
};

5、字符串相加

力扣链接
代码1展示:(头插)

class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        int carry = 0;//进位
        string s;
        while (end1 >= 0 || end2 >= 0)
        {
            //字符转换为数字
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + carry;
            if (ret >= 10)
            {
                ret -= 10;
                carry = 1;
            }
            else
            {
                carry = 0;
            }
            s.insert(s.begin(), ret + '0');
            end1--;
            end2--;
        }
        if (carry == 1)
        {
            s.insert(s.begin(), '1');
        }
        return s;
    }
};

这个代码,使用头插,时间复杂度为O(N^2),算法不是最优的
代码2展示

class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        int carry = 0;//进位
        string s;
        while (end1 >= 0 || end2 >= 0)
        {
            //字符转换为数字
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int ret = val1 + val2 + carry;
            if (ret >= 10)
            {
                ret -= 10;
                carry = 1;
            }
            else
            {
                carry = 0;
            }
            //s.insert(s.begin(), ret + '0');
            s += (ret + '0');
            end1--;
            end2--;
        }
        if (carry == 1)
        {
            s += '1';
            //s.insert(s.begin(), '1');
        }
        reverse(s.begin(), s. end());
        return s;
    }
};

思路:倒着进行加法运算,当两个字符串的位数不一样的时候,位数少的前面进行补0【两个字符串都结束的时候才可以认为结束。【注意下标问为0的位置的进位】】

知识点:大数运算(当一个数字非常大的时候,可以用字符串的形式进行存放),字符串是不能进行加减运算的。此时就需要我们写代码。


总结

以上就是今天要讲的内容,本文详细的介绍了string的OJ题。希望给友友们带来帮助!

09-09 23:18