C++中string使用+刷题学习

常用的功能:

#include 
#include 

string s = "234";                       // 定义string
cout << atoi(s.c_str()) << endl;        // 转换成int类型
cout << s[0] << endl;                   // 读取其中第一个char字节
cout << s.length() << endl;             // 获取字节长度个数
s.resize(6);                            // 更改字符串大小长度
s += "world";                           // 长度会变成6+5=11,但是打印只会打印前6个字节,除非在更改长度后有对应全部赋值
s.append("哇塞");                       // 同上,添加内容

// assign运行没正常执行,内容如下
a.assign("789");//结果为 a="789"
a.assign("123456",1,3); //结果为 a="234";

// 添加内容,0开始的第2个位开始添加
s.insert(2, "insert");
s.erase(2);                             // 删除0开始第2个位后全部内容
s.erase(2, 5);                          // 删除0开始第2个位后5个字
s.replace(2, 6, "xxx");                 // 替换0开始第2个位后6个字为xxx
s.replace(2, 6, "xxx", 2);              // 替换0开始第2个位后6个字为xx,最多替换添加2字节,如果小于2个则后面无法正常打印
s.copy(copyStr, 3, 2);                  // 拷贝s中第2个位开始的3个字节到char copyStr[6] = {0};
q.swap(p);                              // 交换两个string内容
s.empty();                              // 是否为空,返回判断
s.back();                               // 读取最后一个值
s.pop_back();                           // 出栈,最后一个char移除
s.push_back(myChar);                    // 入栈,在最后添加一个char
for (char ch : s) {}                    // 遍历string中char

LeetCode上的练习题

459.重复的子字符串

力扣题目链接

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:
输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成。

示例 2:
输入: “aba”
输出: False

示例 3:
输入: “abcabcabcabc”
输出: True
解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)

官方写法

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        for (int i = 1; i * 2 <= n; ++i) {
            if (n % i == 0) {
                bool match = true;
                for (int j = i; j < n; ++j) {
                    if (s[j] != s[j - i]) {
                        match = false;
                        break;
                    }
                }
                if (match) {
                    return true;
                }
            }
        }
        return false;
    }
};

个人暴力写法

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int len = s.length();
        // 每次比较的基本单元有几个内容
        for (int i = 1; i <= len / 2; i++) {
            if (len % i != 0){
                continue;
            }
            bool ok = true;
            // 总共有len / i个基础单元
            for (int j = 1; j < len / i; j++){
                // 每个基础单元和第0个进行对比是否相同
                for (int m = 0; m < i; m++) {
                    if (s[m] != s[j * i + m])
                    {
                        ok = false;
                        break;
                    }
                }
                if (!ok)
                    break;
            }
            if (ok){
                return true;
            }
        }
        return false;
    }
};

你可能感兴趣的:(c++,学习,开发语言,LeetCode,string)