关联子串
标题:关联子串 | 时间限制: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