礼物·动态规划

题目信息

小张的好朋友小松要过生日了,小张打算为他挑选一件礼物。在市场上他发现有一个珠子手镯的商店很不错。在这家商店会出售特殊的珠子并穿成一个手镯,在货架上珠子排成一排,每一个珠子上有一个小写英文字母。店家有一个特殊的规定,必须在一排珠子中按顺序从左到右挑选。小张心中已经有一个想要送给小松的单词,请你告诉他应该如何挑选珠子使得手镯上珠子的字母组成小张想要的单词。

输入

第一行,一个字符串,表示货架上的一排珠子,仅包含小写英文字母,长度在200000以内。
第二行,一个字符串,表示小张想要的单词,仅包含小写英文字母,长度在10000以内。

输出

输出一行整数,表示小张按照从左到右需要挑选的珠子在货架上的位置。

注意

从左到右按顺序选出的珠子上的字母为’p’,‘p’,‘y’,‘h’,‘a’。串成环形的手镯后可以组成"happy"。
数据保证有解,若有多种选取方法,输出其中任意一个。

测试样例

pxrtpsapyjhuvab
happy
1 5 9 11 14

解答

#include <cstring>
#include <iostream>

using namespace std;

string x;
string word;
int op[200010] = {0};
int lenx;
int lenword;

int main()
{
    //freopen("E://test.txt", "r", stdin);
    cin >> x >> word;
    lenx = x.length();
    lenword = word.length();
    string words = word + word + word;
    //cout << words << endl;

    for (int i = 0; i < lenword; i++)
    {//用i来循环所有单词的组合
        string tmpword(words, i + lenword *5/6, lenword);
        int k = 0;
        for (int j = 0; j < lenx; j++)
        {//用j来循环x中的每一个字符
            if (x[j] == tmpword[k])
            {//如果存在相同的情况
                op[j] = 1;//留下标记
                k++;
            }
            if (k == lenword)
            {//找到结果了,因为k长度与单词长度一样了
                int r = 0;
                for (int p = 0; p < lenx; p++)
                {
                    if (op[p] == 1)
                    {
                        cout << p + 1;
                        if (r < lenword - 1)
                        {
                            cout << " ";
                        }
                        r++;
                    }
                }
                cout << endl;
                return 0;
            }
        }
        memset(op, 0, sizeof(op));
    }
    return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhj12399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值