我在软件开发人员访谈示例问题列表中遇到了此问题,并一直在努力解决。我想出了一个在大多数情况下都可以使用的版本,但是我的一个测试用例失败了,我无法弄清楚出了什么问题。
失败测试:
输入:[“ A”,“ B”,“ C”],“ ADOBECODEBANCDDD”
预期结果:“ BANC”
程序输出:“ ADOBEC”
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string getShortestUniqueSubstring( const vector<char>& arr, const string &str )
{
int minsize = str.size() + 1;
string minstr = "";
if (str.size() >= arr.size())
{
for (int i = 0; i < str.size(); i++)
{
for (int j = i + 1; j <= str.size(); j++)
{
if (j - i >= arr.size())
{
string sub = str.substr(i, j);
bool found = true;
for (int k = 0; k < arr.size(); k++)
{
if (sub.find(arr[k]) == string::npos)
found = false;
}
if (found == true && sub.size() < minsize)
{
if (minsize == arr.size())
return sub;
minsize = sub.size();
minstr = sub;
break;
}
}
}
}
}
return minstr;
}
int main()
{
string inputstr = "ADOBECODEBANCDDD";
vector<char> arr = {'A', 'B', 'C'};
cout << getShortestUniqueSubstring(arr, inputstr);
return 0;
}
答案 0 :(得分:1)
如评论中所述,确保您正确致电str.substr()
;您需要传入子字符串的开始索引及其 length ,而不是其结束索引。
所以代替:
string sub = str.substr(i, j);
确保您输入长度:
string sub = str.substr(i, j - i);