C++中string::find()函数和string::npos函数的使用

string::find()函数:是一个字符或字符串查找函数,该函数有唯一的返回类型,即string::size_type,即一个无符号整形类型,可能是整数也可能是长整数。如果查找成功,返回按照查找规则找到的第一个字符或者子串的位置;如果查找失败,返回string::npos,即-1(当然打印出的结果不是-1,而是一个很大的数值,那是因为它是无符号的)
string::npos静态成员常量:是对类型为size_t的元素具有最大可能的值。当这个值在字符串成员函数中的长度或者子长度被使用时,该值表示“直到字符串结尾”。作为返回值他通常被用作表明没有匹配。

string::npos是这样定义的:static const size_type npos = -1;
因为string::size_type描述的是size,故需为无符号整数型类别。因为缺省配置为size_t作为size_type,于是-1被转换为无符号整数类型,npos也就成为了该类别的最大无符号值。不过实际值还是取决于size_type的实际定义类型,即无符号整型(unsigned int)的-1与无符号长整型(unsigned long)的-1是不同的。

举一道leetcode题来说明用法
给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。

举个例子,A = “abcd”,B = “cdabcdab”。

答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。

注意:

A 与 B 字符串的长度在1和10000区间范围内。

class Solution {
public:
    int repeatedStringMatch(string A, string B) {
        int i=1;
        string s=A;
        while(s.length()<B.length())          //当A长度比B小时,不断加长并记录i
        {
            i++;
            s+=A;
        }
        if(s.find(B)!= s.npos)                  //A比B长后,第一次判断是否是子串
            return i;
        else
        {
            i++;                               //第二次判断是否是子串
            s+=A;
            if(s.find(B)!= s.npos)
                return i;
            else
                return -1;
        }
    }
};
思路:
如果A的长度比B的长度小,那么A需要加大到至少比B的长度大,所以一开始在A长度比B长度小的时候,要不断加大A,并记录下加大的次数

当A的长度比B大时,先判断B是否是A的子串:

1如果是,则直接返回i

2如果不是,就把A再加大一次,再判断B是否是加大后的A的子串:

                 ①如果是,返回i

                 ②如果不是,则直接返回-1,因为在A第一次长度比B大的时候,有可能因为头尾没接上的原因使得B不是A的子串,在A又加大了一次后,解决了头尾没接上这个要素,所以如果此时B仍不是A的子串,那么无论A再怎么加,B都不可能是A的子串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值