给定有效字符串 "abc"
。
对于任何有效的字符串 V
,我们可以将 V
分成两个部分 X
和 Y
,使得 X + Y
(X
与 Y
连接)等于 V
。(X
或 Y
可以为空。)那么,X + "abc" + Y
也同样是有效的。
例如,如果 S = "abc"
,则有效字符串的示例是:"abc"
,"aabcbc"
,"abcabc"
,"abcabcababcc"
。无效字符串的示例是:"abccba"
,"ab"
,"cababc"
,"bac"
。
如果给定字符串 S
有效,则返回 true
;否则,返回 false
。
示例 1:
输入:"aabcbc" 输出:true 解释: 从有效字符串 "abc" 开始。 然后我们可以在 "a" 和 "bc" 之间插入另一个 "abc",产生 "a" + "abc" + "bc",即 "aabcbc"。
示例 2:
输入:"abcabcababcc" 输出:true 解释: "abcabcabc" 是有效的,它可以视作在原串后连续插入 "abc"。 然后我们可以在最后一个字母之前插入 "abc",产生 "abcabcab" + "abc" + "c",即 "abcabcababcc"。
示例 3:
输入:"abccba" 输出:false
示例 4:
输入:"cababc" 输出:false
提示:
1 <= S.length <= 20000
S[i]
为'a'
、'b'
、或'c'
解析:
因为最近两天一直在做关于栈的题目,所以拿到题目首先想到的是用栈实现。但是如果在面试中,可能就不会想到,还是自己掌握的不够熟练。这个题目感觉和消消乐差不多,如果有连着的abc,则消除。上边的数据自动往下落,然后继续删除,如果存在异常的情况,如bac,cba这种的,就说明不能完全消除,则返回false。如果字符串的长度小于3,也返回false。
代码:
bool isValid(string S)
{
int size = S.length();
if (size < 3)
return false;
stack<char>cStack;
for (int i = 0; i < size; i++)
{
if (cStack.empty())
cStack.push(S[i]);
else
{
if(S[i] == 'c')
{
if (cStack.size() < 2)
return false;
else//判断是否abc的顺序
{
char c = cStack.top();
cStack.pop();
if (c <= cStack.top())
return false;
else
cStack.pop();
}
}
else
{
cStack.push(S[i]);
}
}
}
if (cStack.empty())
return true;
return false;
}
更优的方法是用vector模拟栈,因为可以访问前边的元素。
他山之石:
bool isValid(string S)
{
vector<char> stack;
for (char c : S)
{
if (c == 'c')
{
int n = stack.size();
if (n < 2 || stack[n - 1] != 'b' || stack[n - 2] != 'a') return false;
stack.pop_back(), stack.pop_back();
}
else
{
stack.push_back(c);
}
}
return stack.size() == 0;
}