查找包含矢量中所有字符的最小子串分页:1/1

时间:2018-07-04 16:13:04

标签: c++ string search vector substring

我在软件开发人员访谈示例问题列表中遇到了此问题,并一直在努力解决。我想出了一个在大多数情况下都可以使用的版本,但是我的一个测试用例失败了,我无法弄清楚出了什么问题。

失败测试:

  

输入:[“ 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;
}

1 个答案:

答案 0 :(得分:1)

如评论中所述,确保您正确致电str.substr();您需要传入子字符串的开始索引及其 length ,而不是其结束索引。

所以代替:

string sub = str.substr(i, j);

确保您输入长度:

string sub = str.substr(i, j - i);