牛牛的字符串游戏

显然我们得按顺序获得目标t的每个字符。对于我们可以在s中找到这么一个子序列。显然如果找到尾巴还是没有需要的。就得从s[0]开始重新开始顺序找。(然后答案递增,因为表示要重新开始加一个子序列了) 所以不能直接找。所以我们可以另外开一个数组表示在i-1位置,如果要找下一个紧接着的j的话,需要到哪个位置找。
复杂度O(26*n)

int nxt[26][100010];
class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @param t string字符串 
     * @return int整型
     */
    int string(string s, string t) {
        int n = s.size();
        int m = t.size();
        for(int i = 0; i < 26; i ++)
            for(int j = 0; j <= n; j ++)
                nxt[i][j] = n;
        for(int i = 0; i < 26; i ++)
            for(int j = n - 1; j >= 0; j --)
                nxt[i][j] = (s[j] == 'a' + i ? j : nxt[i][j + 1]);
        int cur = 0;
        int ans = 1;
        for(int i = 0; i < m; i ++)
        {
            int x = t[i] - 'a';
            if(nxt[x][0] == n) return -1;
            if(nxt[x][cur] == n) {ans ++; cur = 0;}
            cur = nxt[x][cur] + 1;
        }
        return ans;
    }
};
全部评论

相关推荐

CARLJOSEPH...:宝宝你戾气太大了
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务