20冬季 7-2 Subsequence in Substring (25point(s))

思路:

用两个指针,分别指向母串和子串,然后依次从母串遍历,遍历的时候和子串比较。

设置一个最小长度和存储对应最小长度的字符串ans。

// 03.12 11:00
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

int main() {
	freopen("input.txt", "r", stdin);
	string str, tar;
	cin >> str >> tar; // 输入 字符串str,子串tar
	int minlen = str.size() + 1; // 获取 字符串str的大小,为啥+1?
	string ans; // 存放当前匹配的子序列
	for (int i = 0; i + tar.size() <= str.size(); i++) { // 遍历母串str
		int j = i, pos = 0; // pos指向子串pat的下标
		for (; j <= str.size() && pos < tar.size(); j++) { // 从母串的当前i开始找包含pat的子序列
			if (str[j] == tar[pos]) // 如果子序列和子串的值对上号,就把子串的下标pos右移一位,找下一个对上号的
				pos++;
		}
		if (pos == tar.size()) { // 匹配完,
			if (j - i < minlen) { // 如果当前子序列比最小的还要小
				minlen = j - i;
				ans = str.substr(i, minlen); // 赋值ans为子序列
			}
		}
	}
	cout << ans << endl;
	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值