如何检查字符串向量是否平衡?

时间:2016-04-22 12:33:55

标签: c++ algorithm

我有以下算法,而不是检查字符串是否平衡

bool IsBalanced(string input)
{
    int count = 0;
    for (int i = 0; i < input.size(); i++)
    {
        if (input[i] == '(') count++;
        if (input[i] == ')') count--;
        if (count < 0) return false;
    }
    if (count == 0) return true;
    return false;
}

如何使用此方法检查vector<string>是否平衡?

vector<string> VectorOfBalanced(vector<string> values) 
{
}

示例输入:

values = { "{}[]()", "{[}]}" }

示例输出

return = { "YES", "NO" }`

3 个答案:

答案 0 :(得分:3)

  

如何使用此方法检查向量是否平衡?

你可以使用常规for循环,但在c ++中我们有更多通用算法,如std :: transform。

我认为你的问题不是IsBalanced是否正确,而是如何将它应用于字符串向量。

vector<string> res;
std::transform(
    values.begin(), values.end(), 
    std::back_inserter(res), 
    [](auto& s) -> auto { return IsBalanced(s) ? "Yes" : "No"; });

答案 1 :(得分:2)

你的问题是两个部分:如何检查字符串是否与多组开/关字符相平衡,例如&#34;()&#34;,&#34; {}&#34 ;和&#34; []&#34;,然后如何将其扩展为字符串向量。

后一部分很简单:只需为向量中的每个字符串重复算法。

对于前一部分,您需要以某种堆栈的形式跟踪所有未完成的开头字符的列表。 std::vector<char>将是一个很好的选择:

  1. 将堆栈初始化为空。
  2. 迭代字符串中的每个字符以进行检查。
  3. 如果字符是开头字符之一,例如&#39;(&#39;,&#39; [&#39;或者&#39; {&#39;,请将其推入堆栈)
  4. 如果该字符是结束字符之一,例如&#39;)&#39;]&#39;],或者&#39;}&#39;,那么:if和only如果堆栈非空并且堆栈末尾的字符是匹配的开始字符,则从堆栈中弹出它并继续迭代。否则,字符串不平衡。
  5. 如果在完成迭代后堆栈不为空,则字符串不平衡。
  6. 您应该可以将上述内容简单地翻译成C ++代码。

答案 2 :(得分:0)

这是一个指导路径,而不是一个实际答案。您需要查找std::stack,这样做的简单方法是每次看到一个开放的{ [ ( YourStackName.push()时,YourStackName.pop()一旦看到一个封闭的那个,你就会YourStackName.Empty() TableHeaderCell header1 = new TableHeaderCell(); LiteralControl literal = new LiteralControl(); literal.Text = "Destination"; header1.Controls.Add(literal); header1.Controls.Add(reqF); tRow0.Cells.Add(header1); 1}}。但是你需要保持你的逻辑(如果它是空的,不要拉,要推送哪个字符,三种类型可能有三个堆栈等等)

所以最后,你只是检查Literal是否是{,1},那么它是平衡的!