给定两个字符串A和B ,任务是找到以B为子序列的A的最小子字符串。
例子:
Input: A = “abcdefababaef”, B = “abf”
Output: 5
Explanation:
Smallest substring of A having B as subsequence is abcdef.
Therefore, the required length is 5.
Input: A = “abcdefababaef”, B = “aef”
Output: 3
方法:请按照以下步骤解决问题:
- 将A中所有字符的索引(也存在于B中)存储在Map CharacterIndex中。
- 遍历字符串B的所有字符。
- 检查字符串B的第一个字符是否存在于字符串A中:
- 如果发现为真,则使用字符串A中第一次出现的B [0]的索引初始化两个变量firstVar和lastVar 。
- 更新值后,从Map CharacterIndex中删除该字符。
- 否则,将无法再有其他子字符串。
- 对于B的剩余的字符,检查是否该字符出现在字符串中的或没有。如果发现是真的,遍历所有的字符串中的该字符的出现,如果该字符的字符串是一个指数超过lastVar,然后更新与该指数的lastVar。否则,将无法再有其他子字符串。
- 如果B被完全遍历,则用firstVar和lastVar之间的差异更新答案。
- 打印最终的最小化答案。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to find the length of
// smallest substring of a having
// string b as a subsequence
int minLength(string a, string b)
{
// Stores the characters present
// in string b
map Char;
for (int i = 0; i < b.length(); i++) {
Char[b[i]]++;
}
// Find index of characters of a
// that are also present in string b
map > CharacterIndex;
for (int i = 0; i < a.length(); i++) {
char x = a[i];
// If character is present in string b
if (Char.find(x) != Char.end()) {
// Store the index of character
CharacterIndex[x].push_back(i);
}
}
int len = INT_MAX;
// Flag is used to check if
// substring is possible
int flag;
while (true) {
// Assume that substring is
// possible
flag = 1;
// Stores first and last
// indices of the substring
// respectively
int firstVar, lastVar;
for (int i = 0; i < b.length(); i++) {
// For first character of string b
if (i == 0) {
// If the first character of
// b is not present in a
if (CharacterIndex.find(b[i])
== CharacterIndex.end()) {
flag = 0;
break;
}
// If the first character of b
// is present in a
else {
int x = *(
CharacterIndex[b[i]].begin());
// Remove the index from map
CharacterIndex[b[i]].erase(
CharacterIndex[b[i]].begin());
// Update indices of
// the substring
firstVar = x;
lastVar = x;
}
}
// For the remaining characters of b
else {
int elementFound = 0;
for (auto e : CharacterIndex[b[i]]) {
if (e > lastVar) {
// If index possible for
// current character
elementFound = 1;
lastVar = e;
break;
}
}
if (elementFound == 0) {
// If no index is possible
flag = 0;
break;
}
}
}
if (flag == 0) {
// If no more substring
// is possible
break;
}
// Update the minimum length
// of substring
len = min(len,
abs(lastVar - firstVar) + 1);
}
// Return the result
return len;
}
// Driver Code
int main()
{
// Given two string
string a = "abcdefababaef";
string b = "abf";
int len = minLength(a, b);
if (len != INT_MAX) {
cout << len << endl;
}
else {
cout << "Impossible" << endl;
}
}
Python3
# Python3 program to implement
# the above approach
import sys
# Function to find the length of
# smallest substring of a having
# string b as a subsequence
def minLength(a, b):
# Stores the characters present
# in string b
Char = {}
for i in range(len(b)):
Char[b[i]] = Char.get(b[i], 0) + 1
# Find index of characters of a
# that are also present in string b
CharacterIndex = {}
for i in range(len(a)):
x = a[i]
# If character is present in string b
if (x in Char):
# Store the index of character
CharacterIndex[x] = CharacterIndex.get(x, [])
CharacterIndex[x].append(i)
l = sys.maxsize
# Flag is used to check if
# substring is possible
while(True):
# Assume that substring is
# possible
flag = 1
firstVar = 0
lastVar = 0
# Stores first and last
# indices of the substring
# respectively
for i in range(len(b)):
# For first character of string b
if (i == 0):
# If the first character of
# b is not present in a
if (b[i] not in CharacterIndex):
flag = 0
break
# If the first character of b
# is present in a
else:
x = CharacterIndex[b[i]][0]
# Remove the index from map
CharacterIndex[b[i]].remove(
CharacterIndex[b[i]][0])
# Update indices of
# the substring
firstVar = x
lastVar = x
# For the remaining characters of b
else:
elementFound = 0
for e in CharacterIndex[b[i]]:
if (e > lastVar):
# If index possible for
# current character
elementFound = 1
lastVar = e
break
if (elementFound == 0):
# If no index is possible
flag = 0
break
if (flag == 0):
# If no more substring
# is possible
break
# Update the minimum length
# of substring
l = min(l, abs(lastVar - firstVar) + 1)
# Return the result
return l
# Driver Code
if __name__ == '__main__':
# Given two string
a = "abcdefababaef"
b = "abf"
l = minLength(a, b)
if (l != sys.maxsize):
print(l)
else:
print("Impossible")
# This code is contributed by SURENDRA_GANGWAR
输出:
5
时间复杂度: O(N 2 )
辅助空间: O(N)