LC459 重复的子字符串
使用KMP算法
KMP好复杂…反正就是找到next数组,然后通过推理得到结果。如果 next[len - 1] != 0,则说明字符串有最长相同的前后缀。
如果len % (len - (next[len - 1])) == 0 ,则说明数组的长度正好可以被 (数组长度-最长相等前后缀的长度) 整除 ,说明该字符串有重复的子字符串。
class Solution {
public:
void getNext(int* next, const string& s){
int j=0;
next[0]=0;
for(int i=1;i<s.size();i++){
while(j>0 && s[i]!=s[j]){
j=next[j-1];
}
if(s[i]==s[j]){
j++;
}
next[i]=j;
}
}
bool repeatedSubstringPattern(string s) {
int next[s.size()];
getNext(next, s);
int len=s.size();
if(next[len-1]!=0 && len%(len-(next[len-1]))==0){
return true;
}
return false;
}
};
LC232 用栈实现队列
使用两个stack<int>来实现,一个作为输入栈stkIn,一个作为输出栈stkOut。
push()
的实现就是stkIn的输入。
void push(int x){
stkIn.push(x);
}
peek()
的实现就是:如果stkOut为空,那么将stkIn里面的所有元素都压到stkOut中,然后取top。如果stkOut不为空,那么直接输出top。
int peek() {
if(stkOut.empty()){
while(!stkIn.empty()){
stkOut.push(stkIn.top());
stkIn.pop();
}
}
return stkOut.top();
}
pop()
的实现就是先做一次peek()
,先完成一次stkOut压入数据的过程,然后将stkOut.top()记录并pop。
int pop() {
peek();
int ans=stkOut.top();
stkOut.pop();
return ans;
}
empty()
的实现过程就是判断两个辅助栈是不是都是空
bool empty() {
return stkIn.empty() && stkOut.empty();
}
LC225 用队列实现栈
class MyStack {
public:
queue<int> que;
int stkTop=0;
MyStack() {
}
void push(int x) {
que.push(x);
stkTop=x;
}
int pop() {
int size=que.size();
while(size>2){//留下队尾两个元素
que.push(que.front());
que.pop();
size--;
}
//倒数第二个是新的栈顶元素
stkTop=que.front();
que.push(que.front());
que.pop();
//倒数第一个是原来的栈顶元素,就是要pop出去的。
int ans=que.front();
que.pop();
return ans;
}
int top() {
return stkTop;
}
bool empty() {
return que.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
LC20 有效的括号
这道题首先定义一个哈希表,用来记录右括号对应的左括号。其实这里不用哈希表,用函数或者其他方法实现都是可以的。
然后使用一个stack来记录字符串的输入。遇到左括号就入栈,遇到右括号就去寻找最近的左括号,看看是否能够匹配上。
class Solution {
public:
bool isValid(string s) {
unordered_map<char,char> umap={
{')','('},
{']','['},
{'}','{'}
};
stack<char> stk;
for(auto ch:s){
if(umap.count(ch)){
if(stk.empty()||stk.top()!=umap[ch]){//如果此时stk为空,或者stk的top和当前右括号的类型不匹配,那么false
return false;
}
stk.pop();
}
else{
stk.push(ch);
}
}
return stk.empty();
}
};