概念:
给定一个主串S,一个子串T,主串(串S)中寻找第一次出现模式串(串T)的位置。
按照下标返回
#include<iostream>
using namespace std;
int index(string S, string T) {
int i = 0;
int j = 0;
int Slength = S.length();
int Tlength = T.length();
while (i < S.length() && j < Tlength)
{
if (S[i] == T[j]) { //当主串S[i] 与子串T[j]相等时,主串下标i和子串下标j同时右移
i++;
j++;
}
else {
i = i - j + 1; //主串移动到前一次匹配的后一位
j = 0; //子串返回最开始位置
}
}
if (j == T.length())
return i - j;
else
return -1; //看个人喜好,返回下标位置不要为0就行
}
void test01()
{
string s = "aabb";
string t = "ab";
int pos=index(s, t); //返回匹配对应的下标
cout << pos << endl;
}
int main() {
test01();
return 0;
}
按照位置返回(如第一个字符串的字符位置是1,第二个字符就是2)
这里在输入字符串的时候需要做特殊处理,数组是从0开始计算,所以我们字符串匹配的逻辑要对应就要稍作修改
代码
#include<iostream>
using namespace std;
int index(string S, string T) {
int i = 1; //位置1
int j = 1; //位置1
int Slength = S.length()-1; //逻辑上的长度
int Tlength = T.length()-1; //逻辑上的长度
while (i <=Slength && j <=Tlength)
{
if (S[i] == T[j]) {
i++;
j++;
}
else {
i = i - j + 2;
j = 1;
}
}
if (j > Tlength)
{
return i - Tlength; //返回数组下标,此时可以认为是返回对应的位置
}
else
return 0;
}
void test01()
{
string s, t;
//s[0] = 'a';
//t[0] = '#';
s = "#aabb";
t = "#ab";
//pos返回对应位置(下标)
int pos = index(s, t);
cout << pos << endl;
}
int main() {
test01();
return 0;
}
版权声明:本文为Titoko原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。