Leetcode刷题笔记03:【3】无重复字符的最长字串 (C++string成员方法大全)

第二天 2021-3-4 每日刷两题之一

Leetcode知识树

一、C++ string函数方法大全

查找
成员方法作用
str.find(“ab”)返回字符串 ab 在 str 的第一个位置
str.rfind(“ab”)返回字符串 ab 在 str 的最后一个位置
str.find(“ab”, 2)在 str[2]~str[n-1] 范围内查找并返回字符串 ab 在 str 的位置
str.rfind(“ab”, 2)在 str[0]~str[2] 范围内查找并返回字符串 ab 在 str 的位置
str.find_first_of(“apple”)返回 apple 中任何一个字符首次在 str 中出现的位置
str.find_first_of(“apple”, 2)返回 apple 中任何一个字符首次在 str[2]~str[n-1] 范围中出现的位置
str.find_first_not_of(“apple”)返回除 apple 以外的任何一个字符在 str 中首次出现的位置
str.find_first_not_of(“apple”, 2)返回除 apple 以外的任何一个字符在 str[2]~str[n-1] 范围中首次出现的位置
str.find_last_of(“apple”)返回 apple 中任何一个字符最后一次在 str 中出现的位置
str.find_last_of(“apple”, 2)返回 apple 中任何一个字符最后一次在 str[0]~str[2] 范围中出现的位置
str.find_last_not_of(“apple”)返回除 apple 以外的任何一个字符在 str 中最后一次出现的位置
str.find_last_not_of(“apple”, 2)返回除 apple 以外的任何一个字符在 str[0]~str[2] 范围中最后一次出现的位置
if(str.find("a")!= string::npos) //以上函数如果没有找到,均返回string::npos。
子串
成员方法作用
str.substr(3)返回 [3] 及以后的子串
str.substr(2, 4)返回 str[2]~str[2+(4-1)] 子串(即从[2]开始4个字符组成的字符串)
替换
成员方法作用
str.replace(2, 4, “sz”)返回把 [2]~[2+(4-1)] 的内容替换为 “sz” 后的新字符串
str.replace(2, 4, “abcd”, 3)返回把 [2]~[2+(4-1)] 的内容替换为 “abcd” 的前3个字符后的新字符串
插入
成员方法作用
str.insert(2, “sz”)从 [2] 位置开始添加字符串 “sz”,并返回形成的新字符串
str.insert(2, “abcd”, 3)从 [2] 位置开始添加字符串 “abcd” 的前 3 个字符,并返回形成的新字符串
str.insert(2, “abcd”, 1, 3)从 [2] 位置开始添加字符串 “abcd” 的前 [2]~[2+(3-1)] 个字符,并返回形成的新字符串
追加/删除/交换
成员方法作用
str.push_back(‘a’)在 str 末尾添加字符’a’
str.append(“abc”)在 str 末尾添加字符串"abc"
str.erase(3)删除 [3] 及以后的字符,并返回新字符串
str.erase(3, 5)删除从 [3] 开始的 5 个字符,并返回新字符串
str1.swap(str2)把 str1 与 str2 交换
其他
成员方法作用
str.size()返回字符串长度
str.length()返回字符串长度
str.empty()检查 str 是否为空,为空返回 1,否则返回 0
str[n]存取 str 第 n + 1 个字符
str.at(n)存取 str 第 n + 1 个字符(如果溢出会抛出异常)

C++ string 字符串函数详解

二、【题】无重复字符的最长字串

模式识别1:涉及出现次数/是否出现过,需要用到散列表
模式识别2:涉及子串,考虑滑动窗口

 滑动窗口的两个要素:记录左右窗口位置;确定滑动/持续滑动条件
 一般形式为for循环中使用while(负责向右滑动)和if(负责向左滑动)

惊艳解法:利用字符的ASCII码存储每一个字符最近一次的出现位置
#include<iostream>
#include<string>
using namespace std;

int main() {
    string s = "abcabcbb";
    // 记录字符上一次出现的位置
    int last[128];
    for (int i = 0; i < 128; i++) {
        last[i] = -1;		//必须初始化为-1,因为last[index]+1的必要存在
    }
    int n = s.length();

    int res = 0;
    int start = 0; // 窗口开始位置
    for (int i = 0; i < n; i++) {
        int index = s.at(i);	//查找第i个字符,并转换为ASCII值
        start = max(start, last[index]+1);	//若在当前子串中出现过(last[index]+1)>start),则start移动到出现位置+1
        res = max(res, i - start + 1);		//更新最大长度(长度为i-start+1)
        last[index] = i;					//更新每一个字符的出现位置
    }
    cout<< res;
	return 0;
}

三、运算符重载

C++ 重载运算符和重载函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值