我的思路是:
1.现将两个字符串比较,长的放在a列,短的放在b列
2.根据b列的首字母进行比较,如果相同则两者共进一笔比较下一位,不相同则a列进一笔再比较以此类推
3.当b列比较完且flag状态正常则有子集在a列里
4.反之,当比较次数超过a列的位数时则证明b列不存在a列的里面
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int i = 0, j = 0, k = 0, a1, b1, sum = 0;
bool flag = true;
char a[100];
char b[100];
char t[100];
cin.getline(a, 100);
cin.getline(b, 100);
a1 = strlen(a);
b1 = strlen(b);
if (b1 > a1)
{
swap(a, b);
a1 = strlen(a);
b1 = strlen(b);
}//确保a列长于b列
while (sum <= a1)
{
if (b[j] == a[k])//寻找相同首字母的位置,若相同则执行查找
{
i = k;
for (; j < b1;)
{
if (i == a1)//当标记走到末尾便重置从头开始
i = 0;
if ( a[i]== b[j])//假如两者首字母相同
{//相同刷新状态为true
i++;
j++;
flag = true;
}
else
{//不相同则暂时标记false
flag = false ;
break;
}
}
if (flag = true && j == b1)break;
//如果子集全部检查完并且没有不相同的地方直接跳出结束
j = 0;
k=i;
//自己检查完了没结束则原地重新开始核对
}
else if (a[k] != b[j])
{//头字母不对则a列移动到下一位
k++;
}
sum++;
//统计核对次数,核对次数超过a列位数则证明b不可能是a的子集
if (sum == a1+1)flag = false;
}
if (flag == true)cout << "true";
else if (flag == false)cout << "false";
return 0;
}
我的测试案例:
1.平移子集: QWERT TQ true
2.反平移子集:TQ QWERT true
3.官网测试例:AABBCC CCAA true
4.反复测试: Q5FQ5SQ5F 5S true
5.一发入魂: QWERT Q true
6.心里没他: QWERT Y false
7.众里寻她: QW6548RT 8R true
8.一心一意: Q Q true
但是在一本通上没通过,我知道我的计算方式不是最快捷便利的,但是我感觉我已经把所有的情况都搞出来了,实在不知道是错在哪里,先前有一次就是错误与正确正好相反,还请大神解惑!!