diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyQueue.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T01_MyQueue.java similarity index 95% rename from Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyQueue.java rename to Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T01_MyQueue.java index 8a50a73..bbb2e5b 100644 --- a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyQueue.java +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T01_MyQueue.java @@ -1,7 +1,6 @@ package com.markilue.leecode.stackAndDeque; import org.junit.Test; -import org.omg.CORBA.PUBLIC_MEMBER; import java.util.Stack; @@ -27,12 +26,12 @@ import java.util.Stack; * @Version: 1.0 */ -public class MyQueue { +public class T01_MyQueue { public Stack stack1; public Stack stack2; - public MyQueue() { + public T01_MyQueue() { stack1=new Stack<>(); stack2=new Stack<>(); @@ -88,7 +87,7 @@ public class MyQueue { @Test public void test(){ - MyQueue myQueue = new MyQueue(); + T01_MyQueue myQueue = new T01_MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) System.out.println(myQueue.peek());// return 1 diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyQueue1.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T01_MyQueue1.java similarity index 95% rename from Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyQueue1.java rename to Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T01_MyQueue1.java index 4240e37..32b9523 100644 --- a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyQueue1.java +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T01_MyQueue1.java @@ -26,12 +26,12 @@ import java.util.Stack; * @Version: 1.0 */ -public class MyQueue1 { +public class T01_MyQueue1 { public Stack stack1; public Stack stack2; - public MyQueue1() { + public T01_MyQueue1() { stack1=new Stack<>(); stack2=new Stack<>(); @@ -76,7 +76,7 @@ public class MyQueue1 { @Test public void test(){ - MyQueue1 myQueue = new MyQueue1(); + T01_MyQueue1 myQueue = new T01_MyQueue1(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) System.out.println(myQueue.peek());// return 1 diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyStack.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T02_MyStack.java similarity index 72% rename from Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyStack.java rename to Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T02_MyStack.java index e1b86ae..36d8dd8 100644 --- a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyStack.java +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T02_MyStack.java @@ -4,34 +4,33 @@ import org.junit.Test; import java.util.ArrayDeque; import java.util.Queue; -import java.util.concurrent.PriorityBlockingQueue; /** * @BelongsProject: Leecode * @BelongsPackage: com.markilue.leecode.stackAndDeque * @Author: dingjiawen * @CreateTime: 2022-09-13 09:59 - * @Description: TODO 力扣225题 用队列实现栈: - * 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 - * 实现 MyStack 类: - * void push(int x) 将元素 x 压入栈顶。 - * int pop() 移除并返回栈顶元素。 - * int top() 返回栈顶元素。 - * boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。 - *

+ * @Description: + * TODO 力扣225题 用队列实现栈: + * 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 + * 实现 MyStack 类: + * void push(int x) 将元素 x 压入栈顶。 + * int pop() 移除并返回栈顶元素。 + * int top() 返回栈顶元素。 + * boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。 *

* 注意: - * 你只能使用队列的基本操作 —— 也就是push to back、peek/pop from front、size 和is empty这些操作。 - * 你所使用的语言也许不支持队列。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。 + * 你只能使用队列的基本操作 —— 也就是push to back、peek/pop from front、size 和is empty这些操作。 + * 你所使用的语言也许不支持队列。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。 * @Version: 1.0 */ -public class MyStack { +public class T02_MyStack { public Queue queue1; public Queue queue2; - public MyStack() { + public T02_MyStack() { queue1 = new ArrayDeque<>(); queue2 = new ArrayDeque<>(); } @@ -96,7 +95,7 @@ public class MyStack { @Test public void test() { - MyStack obj = new MyStack(); + T02_MyStack obj = new T02_MyStack(); obj.push(1); obj.push(2); obj.push(3); diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyStack1.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T02_MyStack1.java similarity index 95% rename from Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyStack1.java rename to Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T02_MyStack1.java index 6d93e2e..85fef83 100644 --- a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/MyStack1.java +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T02_MyStack1.java @@ -24,12 +24,12 @@ import java.util.Queue; * 你所使用的语言也许不支持队列。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。 * @Version: 1.0 */ -public class MyStack1 { +public class T02_MyStack1 { public Queue queue1; - public MyStack1() { + public T02_MyStack1() { queue1 = new ArrayDeque<>(); } @@ -71,7 +71,7 @@ public class MyStack1 { @Test public void test() { - MyStack1 obj = new MyStack1(); + T02_MyStack1 obj = new T02_MyStack1(); obj.push(1); obj.push(2); obj.push(3); diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/IsValid.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T03_IsValid.java similarity index 98% rename from Leecode/src/main/java/com/markilue/leecode/stackAndDeque/IsValid.java rename to Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T03_IsValid.java index bce2c3d..0e686de 100644 --- a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/IsValid.java +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/T03_IsValid.java @@ -18,7 +18,7 @@ import java.util.Stack; * 每个右括号都有一个对应的相同类型的左括号。 * @Version: 1.0 */ -public class IsValid { +public class T03_IsValid { @Test public void test() { String s = "{([([])])}"; diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T01_MyQueue.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T01_MyQueue.java new file mode 100644 index 0000000..904be45 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T01_MyQueue.java @@ -0,0 +1,68 @@ +package com.markilue.leecode.stackAndDeque.second; + +import java.util.Stack; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.stackAndDeque.second + *@Author: dingjiawen + *@CreateTime: 2023-01-02 11:46 + *@Description: + * TODO 二刷leecode232题 用栈实现队列 + * 实现 MyQueue 类: + * void push(int x) 将元素 x 推到队列的末尾 + * int pop() 从队列的开头移除并返回元素 + * int peek() 返回队列开头的元素 + * boolean empty() 如果队列为空,返回 true ;否则,返回 false + * 说明: + * 你只能使用标准的栈操作 —— 也就是只有push to top,peek/pop from top,size, 和is empty操作是合法的。 + * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。 + *@Version: 1.0 + */ +public class T01_MyQueue { + + //cur维持的是一个队列;temp维持的是一个栈 + //入栈时走temp,出栈的时候走cur + //当cur没了之后,将temp中的值灌入cur + Stack cur; + Stack temp; + + public T01_MyQueue() { + cur=new Stack<>(); + temp=new Stack<>(); + } + + public void push(int x) { + temp.push(x); + } + + public int pop() { + if(!cur.empty()){ + //cur有就出cur + return cur.pop(); + }else { + //cur没有,就将temp灌入 + while (!temp.empty()){ + cur.push(temp.pop()); + } + return cur.pop(); + } + } + + public int peek() { + if(!cur.empty()){ + return cur.peek(); + }else { + //cur没有,就将temp灌入 + while (!temp.empty()){ + cur.push(temp.pop()); + } + return cur.peek(); + } + + } + + public boolean empty() { + return temp.empty()&& cur.empty(); + } +} diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T02_MyStack.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T02_MyStack.java new file mode 100644 index 0000000..4eab1d0 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T02_MyStack.java @@ -0,0 +1,70 @@ +package com.markilue.leecode.stackAndDeque.second; + +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.stackAndDeque.second + *@Author: dingjiawen + *@CreateTime: 2023-01-02 12:23 + *@Description: + * TODO 二刷力扣225题 用队列实现栈: + * 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 + * 实现 MyStack 类: + * void push(int x) 将元素 x 压入栈顶。 + * int pop() 移除并返回栈顶元素。 + * int top() 返回栈顶元素。 + * boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。 + * 注意: + * 你只能使用队列的基本操作 —— 也就是push to back、peek/pop from front、size 和is empty这些操作。 + * 你所使用的语言也许不支持队列。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。 + *@Version: 1.0 + */ +public class T02_MyStack { + + //temp当队列,cur当栈 + Queue temp; + Queue cur; + + public T02_MyStack() { + temp=new LinkedList<>(); + cur=new LinkedList<>(); + } + + public void push(int x) { + if(temp.isEmpty()){ + temp.add(x); + while (!cur.isEmpty()){ + temp.add(cur.poll()); + } + }else { + cur.add(x); + while (!temp.isEmpty()){ + cur.add(temp.poll()); + } + } + } + + public int pop() { + if(temp.isEmpty()){ + return cur.poll(); + }else { + return temp.poll(); + } + } + + public int top() { + if(temp.isEmpty()){ + return cur.peek(); + }else { + return temp.peek(); + } + } + + public boolean empty() { + return temp.isEmpty()&&cur.isEmpty(); + } +} diff --git a/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T03_IsValid.java b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T03_IsValid.java new file mode 100644 index 0000000..5cec615 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/stackAndDeque/second/T03_IsValid.java @@ -0,0 +1,120 @@ +package com.markilue.leecode.stackAndDeque.second; + +import java.util.Deque; +import java.util.LinkedList; +import java.util.Stack; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.stackAndDeque.second + *@Author: dingjiawen + *@CreateTime: 2023-01-02 13:07 + *@Description: + * TODO 二刷力扣20题 有效的括号: + * 给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。 + *

+ * 有效字符串需满足: + * 左括号必须用相同类型的右括号闭合。 + * 左括号必须以正确的顺序闭合。 + * 每个右括号都有一个对应的相同类型的左括号。 + *@Version: 1.0 + */ +public class T03_IsValid { + + /** + * 思路:本质上是一个左右匹配,见词就消的思路,使用栈实现 + * 速度击败98.79%,内存击败58.57% + * @param s + * @return + */ + public boolean isValid(String s) { + char[] chars = s.toCharArray(); + + Stack stack = new Stack<>(); + + for (char aChar : chars) { + if(aChar=='}'){ + if(stack.isEmpty()||stack.pop()!='{'){ + return false; + } + }else if(aChar==')'){ + if(stack.isEmpty()||stack.pop()!='('){ + return false; + } + }else if(aChar==']'){ + if(stack.isEmpty()||stack.pop()!='['){ + return false; + } + }else { + stack.push(aChar); + } + } + if(stack.isEmpty()){ + return true; + }else { + return false; + } + + + } + + + /** + * 代码随想方法,直接见左加右,相对较为简洁 + * @param s + * @return + */ + public boolean isValid1(String s) { + Deque deque = new LinkedList<>(); + char ch; + for (int i = 0; i < s.length(); i++) { + ch = s.charAt(i); + //碰到左括号,就把相应的右括号入栈 + if (ch == '(') { + deque.push(')'); + }else if (ch == '{') { + deque.push('}'); + }else if (ch == '[') { + deque.push(']'); + } else if (deque.isEmpty() || deque.peek() != ch) { + return false; + }else {//如果是右括号判断是否和栈顶元素匹配 + deque.pop(); + } + } + //最后判断栈中元素是否匹配 + return deque.isEmpty(); + } + + + /** + * 官方最快:较为巧妙,使用数组模拟栈 + * 速度击败100%,内存击败45.42% + * @param s + * @return + */ + public boolean isValid2(String s){ + if(s == null || s.length()==0){ + return true; + } + char[] str = s.toCharArray(); + int N = str.length; + int size = 0; + char[] stack=new char[N]; + for (int i=0;i 0 && c.charAt(i) != c.charAt(index)) { + //如果当前两数不相等,寻找 上次的相同前缀的位置next[index-1] 的下一个字符是否相等 + index = next[index - 1]; + } + + if (c.charAt(i) == c.charAt(index)) { + index++; + } + + next[i] = index; + } + + return next; + } + + + /** + * 官方最快:在字符串前面加一个空格 + * 速度击败90.73%,内存击败14.30% 5ms + * @param s + * @return + */ + public boolean repeatedSubstringPattern1(String s) { + //一个用contain, 一个用KMP + int len = s.length(); + s = ' ' + s; + char[] ch = s.toCharArray(); + int[] next = new int[len + 1]; + for(int i = 2, j = 0; i <= len; i++){ + while(j > 0 && ch[i] != ch[j + 1]){ + j = next[j]; + } + if(ch[i] == ch[j + 1]){ + j++; + } + next[i] = j; + } + + if(next[len] > 0 && len % (len - next[len]) == 0){ + return true; + } + return false; + + } + + +}