链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
给定一个仅由小写字母构成的字符串 SSS。
对于所有位置 iii,求出 S[i,...,∣S∣]S[i,...,|S|]S[i,...,∣S∣] 第一个 leetcode 子序列的终止位置。
输入描述:
一行一个字符串 S(1≤∣S∣≤2×105)S(1\leq |S|\leq 2\times 10^5)S(1≤∣S∣≤2×105)。
输出描述:
一行共 ∣S∣|S|∣S∣ 个整数,第 iii 个整数表示 S[i,...,∣S∣]S[i,...,|S|]S[i,...,∣S∣] 第一个 leetcode 子序列的终止位置。若 S[i,...,∣S∣]S[i,...,|S|]S[i,...,∣S∣] 不存在 leetcode 子序列,答案为 000。
示例1
输入
复制leetcodleetcode
leetcodleetcode
输出
复制9 15 15 15 15 15 15 15 0 0 0 0 0 0 0
9 15 15 15 15 15 15 15 0 0 0 0 0 0 0
#include <bits/stdc++.h>
int res[200005];
using namespace std;
/*
链接:https://ac.nowcoder.com/acm/contest/78965/F
来源:牛客网
示例1
输入
leetcodleetcode
输出
9 15 15 15 15 15 15 15 0 0 0 0 0 0 0
*/
/*
从后往前找,只有找到dp[]才会有数值,那么,就会符合条件,传递给前一个字母
如果到l 这个字母还是有一个条件不符合 那么就不会符合了 ,res[i]== dp[1]就表示找到最后 这个dp[1]是不是能存储上这个leetcode最先结束的位置
*/
int main()
{
int n;
string s;
s.clear();
cin>>s;
int dp[100];
n = s.length();
for(int i = 1; i <= 50; i++)
{
dp[i] = 0;
}
s = '0' + s;
for(int i = n; i >= 1; i--)
{
if(s[i]=='l')
{
if(dp[2] > i)
{
dp[1] = dp[2];
}
}
else if(s[i]=='e')
{
dp[8] = i;
if(dp[3] > i)
{
dp[2] = dp[3];
}
if(dp[4] > i)
{
dp[3] = dp[4];
}
}
else if(s[i]=='t')
{
if(dp[5] > i)
{
dp[4] = dp[5];
}
}
else if(s[i]=='c')
{
if(dp[6] > i)
{
dp[5] = dp[6];
}
}
else if(s[i]=='o')
{
if(dp[7] > i)
{
dp[6] = dp[7];
}
}
else if(s[i]=='d')
{
if(dp[8] > i)
{
dp[7] = dp[8];
}
}
res[i] = dp[1];
}
for(int i = 1; i <= n; i++){
printf("%d ", res[i]);
}
printf("\n");
return 0;
}