问题描述
对于字符串s和t,若t是s子串,返回t在s中的位置(t的首字符在s中对应的下标),否则返回-1。
问题求解
采用直接穷举法求解,称为BF算法。该算法从s的每一个字符开始查找,看t是否会出现。
代码
int BF(string s, string t)
{
int i = 0, j = 0;
while (i < s.length() && j < t.length())
{
if (s[i] == t[j])
{
i++;
j++;
}
else
{
i = i - j + 1;//i回退
j = 0;
}
}
if (j == t.length())
return i - j;
else
return -1;
}
问题扩展
有两个字符串s和t,设计一个算法求t在s中出现的次数。例如,s=“abababa”,t=“aba”,则t在s中出现2次。
采用BF算法思路。用num记录t在s中出现的次数(初始时为0)。
当在s中找到t的一次出现时,num++,此时j=t的长度,i指向s中本次出现t子串的下一个字符,所以为了继续查找t子串的下一次出现,只需要置j=0。
int Count(string s, string t)
{
int num = 0;
int i = 0, j = 0;
while (i < s.length() && j < t.length())
{
if (s[i] == t[j])
{
i++;
j++;
}
else
{
i = i - j + 1;//i回退
j = 0;
}
if (j = t.length())
{
num++;
i = i - j + 1;//i回退
j = 0;
}
}
return num;
}