LeetCode28.实现strStr()
题目:
给定一个haystack字符串和一个needle字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
补充说明:
思路1:KMP算法
KMP算法(研究总结,字符串):
https://www.cnblogs.com/SYCstudio/p/7194315.html
-
解决问题:在字符串(主串)中的模式定位问题(也称关键字搜索问题)(查找模式串P在文本串S中的位置)
-
算法流程
- 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置
- 如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;
- 如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。
- 换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值(next 数组的求解会在下文的3.3.3节中详细阐述),即移动的实际位数为:j - next[j],且此值大于等于1。
方法2:遍历
遍历
代码2:
public int strStr(String haystack, String needle) {
for(int i=0;i<=haystack.length()-needle.length();++i) {
int j=0;
for(;j<needle.length();++j) {
if(needle.charAt(j)!=haystack.charAt(i+j))
break;
}
if(j==needle.length())
return i;
}
return -1;
}
LeetCode54.螺旋矩阵
题目:
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
思路:
判断边界,只要rowBegin<=rowEnd并且colBegin<colEnd时,就存在没有读取的数
从左往右读完之后,rowBegin++
从上往下读完之后,colEnd–
此时判断是否满足rowBegin <= rowEnd,若满足,则从右往左,rowEnd–;
判断是否满足colBegin <= colEnd,若满足,则从下往上,colBegin++;
- while(rowBegin<=rowEnd && colBegin<=colEnd)
此处取等号的原因是,如果仅仅取小于可能会出现:最后一次操作使得rowEnd–,colBegin++,且rowEndrowBegin,colBegincolEnd的情况,但是matrix[rowEnd][colBegin]并没有读取
如矩阵
1 2 3
8 9 4
7 6 5
如果不取=,则9无法读出
代码:
public List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> res = new ArrayList<>();
if(matrix.length==0) return res;
int rowBegin = 0;
int rowEnd = matrix.length-1;
int colBegin = 0;
int colEnd = matrix[0].length-1;
while(rowBegin<=rowEnd && colBegin<=colEnd) {
for(int j = colBegin;j<=colEnd;++j) //先向右
res.add(matrix[rowBegin][j]);
rowBegin++;//横向便利完之后,rowBegin++,横向内层 靠近一层
for(int j=rowBegin;j<=rowEnd;++j)
res.add(matrix[j][colEnd]);
colEnd--;//向下,再可以螺旋的最后一列上进行操作,操作完后,可以操作的最后一列--
if(rowBegin<=rowEnd) {//判断此时还存在横向操作没有,如果存在,则向左,此时矩阵向上缩减一格
for (int j = colEnd; j >= colBegin; j --)
res.add(matrix[rowEnd][j]);
}
rowEnd--;
if (colBegin <= colEnd) {
// Traverse Up
for (int j = rowEnd; j >= rowBegin; j --)
res.add(matrix[j][colBegin]);
}
colBegin ++;
}
return res;
}