csp基础之string

一、基础知识

1. string的读入、输出、求长度、比较、拼接、遍历:

getline(cin,s):读入一个包含空格的字符串

cin>>s:读入一个不包含空格的字符串

cout<

s.size() :求长度

s1>s2:直接比较大小

s+=t:拼接字符串

for(char c:s){ c... }:遍历字符串中每一个元素

for(int i=0;i

2. 局部变量和全局变量赋初值情况:局部默认是随机;全局默认全是0

3. 常用的常量:

最小值:INT_MIN 、LLONG_MIN

最大值:INT_MAN 、LLONG_MAX 

 

4. 原则:尽量减少循环和不必要的数组

如,输入并求最小值

int n,x,mi=INT_MAX;
for(int i=0;i>x;
    if(x>mi;

二、经典例题&&函数应用:

1.查找截取函数:.find()  && .substr()

s.find(str) //返回 substr第一次出现的s下标,s中无则返回-1(string::npos)

s.find(str,index)//在s[index]后再寻找str

s.rfind(str)//反向查找,找到第一个str/char

s.substr(index,substr_len) // index截取位置,substr_len是截取长度(不写默认到最后)

2. 连续子序列的判断—— if (t.find(p) != string::npos) 

//子序列的判断(判断t中是否有p,必须连续)
#include 
#include 
using namespace std;

int main() {
    string p, t;
    cin >> p >> t;

    if (t.find(p) != string::npos) {
        cout << "Yes" << endl;
    } else {
        cout << "No" << endl;
    }

    return 0;
}

BF方法(可学可不学)

#include 
#include 
using namespace std;

int main() {
    string p, t;
    cin >> p >> t;

    int n = t.size(), m = p.size();
    bool found = false;

    for (int i = 0; i <= n - m; ++i) {  // 枚举主串起点
        int j = 0;
        while (j < m && t[i + j] == p[j]) {  // 从 i 开始逐一比对
            ++j;
        }
        if (j == m) {  // 成功匹配
            found = true;
            break;
        }
    }

    if (found) cout << "Yes" << endl;
    else cout << "No" << endl;

    return 0;
}

3. string删除插入替换 

s.erase(s.begin()+n)//删除第n个字符

s.erase(index,len)//删除index后长度为len的所有字符

s.erase(s.begin(),s.end())//删除i~j内所有元素

常与remove()一起用:

例如:s.erase(remove(s.begin(),s.end(),'*'),s.end());

补充:remove() 不会真正删除元素,而是在一定范围内[s.begin(),s.end())通过移动元素(不等于value的元素)来覆盖要移除的值(value),返回移动后的最后一个非value值所在位置的下一个位置的迭代器。

示例
对于数组 [1, 2, 3, 2, 4, 2],调用 remove(arr, arr+6, 2) 后:

  • 数组变为 [1, 3, 4, 2, 4, 2](前三个元素是有效元素)。
  • 返回值指向第 4 个元素(即第一个未被覆盖的 2)。

s.insert()

csp基础之string_第1张图片

s.replace(i,len,str)//把 s[i]~s[i+len] 删除,换成 str

s.replace(i,len,n,c)//把 s[i]~s[i+len] 删除,换成 n个c

s.replace(first,last,t.first,t.last)//把s的某区间字符串替换成t某区间(迭代器表示)

std::replace(s.begin(),s.end(),a,b)//全局函数,在algorithm中,把s中所有的a替换成b

例题,把s中所有c1转换成c2

do {  int p=s.find(c1);  
      s.replace(p,1,c2); 
} while(p!=string::npos);

4.  字符类型判断 [is...],大小写转换[to...],字符串排序[sort],都在

4.1 字符类型判断以及转换

isalpha(c);islower(c) ; isupper(); isdigit(c) ; //判断字母、小写、大写、数字的,0假,非0真

tolower(c) ; toupper(c); //大写转小写,小写转大写

4.2  字符串排序(正和逆)

sort(s.begin(),s.end())//注意 s.end()获取的是s中最后字符的位置+1

sort(s.begin(),s.end(),greater() ) //greater() 中Type可以是intchardouble

4.3 元素位置倒序

reverse(s.begin(),s.end())

4.4 数字与字符(串)转换

字符变数字:c-‘0’ 得到5; 数字变字符:c+'0' 得到‘c’ ;字符串变数字:num=num*10 + s[i]-'0'

stoi(s): 把 数字字符串s 转换成 int数字 "256"—>256

stoll(s): 把 数字字符串s 转换成 long long数字 "2569875445664"—>2569875445664

stof(s): 把 数字字符串s 转换成 float数字 "256.314"—>256.314

4.5 字符串大小写一次性转换函数

transform(s.begin(),s.end(),s.begin();::tolower);//字符串全部转小写
transform(s.begin(),s.end(),s.begin();::toupper);//字符串全部转大写

附录:

ASCII码对照表,ASCII码一览表(非常详细) - C语言中文网

你可能感兴趣的:(c++学习,算法)