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的子串。