假设我们给定字符串“ abc”有效。因此,可以从任何有效的字符串V中将V分为X和Y两部分,以使X + Y与V相同(X或Y可以为空)。然后,X +“ abc” + Y也有效。因此,例如S =“ abc”,则有效字符串的示例为:“ abc”,“ aabcbc”,“ abcabc”,“ abcabcababcc”。无效字符串的一些示例是:“ abccba”,“ ab”,“ cababc”,“ bac”。仅当给定的字符串S有效时,我们才必须检查true。
因此,如果输入类似于“ abcabcababcc”,则该输入有效,因此输出为true。
为了解决这个问题,我们将遵循以下步骤-
-
定义一个堆栈st
-
对于0到S大小的i
-
将c插入st
-
而st> = 3的大小
-
按a,然后按b,然后按c进入st,并打破循环
-
c:= st的顶部,并从st弹出顶部的元素
-
b:= st的顶部,并从st弹出顶部的元素
-
a:= st的顶部,并从st弹出顶部的元素
-
temp:= temp与一个
-
temp:= temp与b连接
-
temp:= temp与c连接
-
如果temp为“ abc”,则进行下一次迭代
-
除此以外
-
如果st为空或S [i]与R
17;cR17;不同,则将S [i]压入堆栈 -
除此以外
-
如果st为空,则返回true,否则返回false
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isValid(string S) {
stack <char> st;
for(int i = 0; i < S.size(); i++){
if(st.empty() || S[i] != 'c'){
st.push(S[i]);
}else{
st.push('c');
while(st.size() >= 3){
char c = st.top();
st.pop();
char b = st.top();
st.pop();
char a = st.top();
st.pop();
string temp = "";
temp += a;
temp += b;
temp += c;
if(temp == "abc"){
continue;
}else{
st.push(a);
st.push(b);
st.push(c);
break;
}
}
}
}
return st.empty();
}
};
main(){
Solution ob;
cout << (ob.isValid("abcabcababcc"));
}
输入值
“abcabcababcc”
输出结果
1
正文完