小美将自己朋友的名字写在了一块,惊讶地发现她写出的那个字符串S有一个惊人的性质:一个人是小美的朋友当且仅当她/他的名字是那个字符串的子序列。现在小团想根据那个字符串判断一个人是不是小美的朋友。
*子序列:一个字符串A是另外一个字符串B的子序列,当且仅当可以通过在B中删除若干个字符(也可能一个都不删),其他字符保留原来顺序,使得形成的新字符串B’与A串相等。例如,ABC是AABDDC的子序列,而ACB不是AABDDC的子序列。
小美将自己朋友的名字写在了一块,惊讶地发现她写出的那个字符串S有一个惊人的性质:一个人是小美的朋友当且仅当她/他的名字是那个字符串的子序列。现在小团想根据那个字符串判断一个人是不是小美的朋友。
*子序列:一个字符串A是另外一个字符串B的子序列,当且仅当可以通过在B中删除若干个字符(也可能一个都不删),其他字符保留原来顺序,使得形成的新字符串B’与A串相等。例如,ABC是AABDDC的子序列,而ACB不是AABDDC的子序列。
第一行两个正整数n,m分别表示小美朋友字符串S的长度,以及小团想了解是不是小美朋友的那个人的名字字符串T的长度。
第二行长度为n且仅包含小写字母的字符串S
第三行长度为m且仅包含小写字母的字符串T
如果小团想了解的那个人不是小美的朋友(即,T不是S的子序列),输出一行”No”,否则输出一行”Yes”,并在第二行将T对应到S中的位置之和输出出来(从1开始编号),由于可能有多种对应方式,请输出最小的位置之和。请参见样例解释获取更详细说明
6 3 aabddc abc
Yes 10
对于样例1
S=aabddc T=abc,T中a可以与S中第1个字符a对应起来,b可以与S中第3个字符b对应起来,c可以与S中第6个字符c对应起来,这样一来就找到了一个S中的子序列(仅保留第1、3、6个字符形成的子序列),使其与T相等。这种情况下,位置之和为1+3+6=10
还有一种方案,是S仅保留第2、3、6个字符形成的子序列abc,仍然满足与T相等的条件。但是位置之和为2+3+6=11,并不是位置之和最小的,因而输出第一种对应方案的位置之和:10
6 3 aabddc acb
No
对于样例2
可以保留S中的第1、3、6个字符,形成子序列abc,但于T串acb不相等,因为b、c位置并不对应。可以证明,没有任何一种取S子序列的方式,可以使得取出的子序列和T相等,因而输出No
对于30%的数据, max(n,m)<=20
对于60%的数据, max(n,m)<=2000
对于100%的数据, max(n,m)<=200000
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int n,m; cin>>n>>m; vector<char> s; vector<char> t; long long result=0; int index=0; int temp = n+1; while(temp--){ char one = getchar(); if(one !='\n') s.push_back(one); } temp = m+1; while(temp--){ char one = getchar(); if(one !='\n') t.push_back(one); } /* for(int i=0;i<s.size();i++){ cout<<s[i]; } cout<<endl; for(int i=0;i<t.size();i++){ cout<<t[i]; }*/ for(int i=0;i<s.size();i++){ //cout<<index; if(t[index]==s[i]){ //cout<<t[index]<<"+"<<index; result=result+i+1; index++; } if(index==m) break; } if(index<m){ cout<<"No"<<endl; return 0; } cout<<"Yes"<<endl; cout<<result<<endl; return 0; }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().trim().split(" "); int n = Integer.parseInt(params[0]); int m = Integer.parseInt(params[1]); String S = br.readLine().trim(); String T = br.readLine().trim(); int j = 0; long posSum = 0; for(int i = 0; i < n; i++){ if(j < T.length() && S.charAt(i) == T.charAt(j)){ j++; posSum += i + 1; } } if(j == T.length()){ System.out.println("Yes"); System.out.println(posSum); }else{ System.out.println("No"); } } }
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); sc.nextLine(); String s1 = sc.nextLine().trim(); String s2 = sc.nextLine().trim(); int count = 0; int lastEnd = 0; long res = 0; for (int i = 0; i < s2.length(); i++) { char c = s2.charAt(i); for (int j = lastEnd; j < s1.length(); j++) { if (s1.charAt(j) == c) { res += j + 1; lastEnd = j + 1; count++; break; } } } if (count == s2.length()) { System.out.println("Yes"); System.out.println(res); } else { System.out.println("No"); } } }
package main import "fmt" func main() { var M,N int var Mstr,Nstr string fmt.Scan(&M,&N,&Mstr,&Nstr) b,index:=0,0 //var res string for i:=0;i<M;i++{ if Mstr[i]==Nstr[index]&&index<N{ index++ b+=i+1 } } if index==N{ fmt.Println("Yes") fmt.Println(b) }else { fmt.Println("No") } }
const rl = require('readline').createInterface({ input: process.stdin, output: process.stdout }); let inputArr = [];//输入数组,用来保存输入 rl.on('line', function(line){ inputArr.push(line);//将输入保存到inputArr数组中 例:得到['6 3', 'aabddc', 'abc'] }).on('close', function(){ let [n, m] = inputArr[0].split(' ').map(Number);//获取n, m deal(n, m, inputArr[1], inputArr[2])//调用deal()函数,输出结果 }) function deal(n, m, s, t){ let p = 0, q = 0, res = 0; while(p < n && q < m){ if(s[p] === t[q]){ res += p + 1; p++; q++; }else{ p++; } } if(q === m){ console.log('Yes'); console.log(res); }else{ console.log('No'); } }
/** * author:刷完这题就去睡觉 * created: **/ #include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ios::sync_with_stdio(false); cin.tie(0); ll n,m; cin>>n>>m; if(n<m){ cout<<"No"<<endl; return 0; } string s,t; cin>>s; cin>>t; ll l=0,r=0; ll ans=0; while(l<n&&r<m){ if(s[l]==t[r]){ ans+=(l+1); l++; r++; }else{ l++; } } if(r==m){ cout<<"Yes"<<endl; cout<<ans<<endl; }else{ cout<<"No"<<endl; } return 0; }
n,m = map(int,input().split()) string = input() target = input() index_num = 0 i,j = 0,0 while i<n and j<m: if string[i]==target[j]: j+=1 index_num+=i+1 i+=1 if j==m: print("Yes") print(index_num) else: print("No")
import java.util.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); String S = sc.next(); String T = sc.next(); print(S,T); } public static void print(String S,String T){ if(S.length()<T.length()){ System.out.println("No"); return; } long res = 0; int i = 0; int j = 0; while(i<T.length() && j<S.length()){ if(T.charAt(i)==S.charAt(j)){ i++; res+=j+1; } j++; } if( i == T.length()){ System.out.println("Yes"); System.out.print(res); } else{ System.out.println("No"); } } }
m,n=[int(i) for i in input().split()] l=input() ll=input() sum=0 a=-1 b=len(l)-1 if len(ll)>len(l): print('No') else: for i in ll: p=0 for j in range(a+1,b+1): if i==l[j]: a=j sum+=a+1 p=1 break if p==0: print('No') break if p==1: print('Yes') print(sum)