关联子串
标题:关联子串 | 时间限制:1秒 | 内存限制:262144K |
给定两个字符串str1和str2,如果字符串str1中的字符,经过排列组合后的字符串中,只要有一个字符串是str2的子串,则认为str1是str2的关联子串。
若str1是str2的关联子串,请返回子串在str2的起始位置;
若不是关联子串,则返回-1。
若str1是str2的关联子串,请返回子串在str2的起始位置;
若不是关联子串,则返回-1。
#include <iostream>
#include <algorithm>
using namespace std;
int getFirstStr1InStrIndex(string str1, string str2)
{
int result=-1;
int len1 = str1.size();
int len2 = str2.size();
if(len1 > len2) return -1;
for(int i=0;i<len2-len1+1;i++)
{
string cur = str2.substr(i,len1);
sort(cur.begin(),cur.end());
if(cur == str1) return i;
}
return result;
}
int main()
{
string str1,str2;
cin>>str1>>str2;
sort(str1.begin(),str1.end());
int result = getFirstStr1InStrIndex(str1,str2);
cout<<result;
return 0;
}
s,t=input().split() now = [0]*26 for c in s: now[ord(c)-97]+=1 cnt = [[0]*26 for _ in range(len(t)+1)] for i in range(1,len(t)+1): for j in range(26): cnt[i][j] = cnt[i-1][j] cnt[i][ord(t[i-1])-97]+=1 ans = -1 for i in range(len(t)-len(s)+1): flag =True for j in range(26): if cnt[i+len(s)][j]-cnt[i][j] != now[j]: flag = False if flag: ans = i break print(ans) //manfen
