常用的功能:
#include <string>
#include <cstring>
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;
}
};