LeetCode刷题——19.06.10

LeetCode28.实现strStr()

题目:

给定一个haystack字符串和一个needle字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

LeetCode刷题——19.06.10_第1张图片
补充说明:
LeetCode刷题——19.06.10_第2张图片

思路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



LeetCode54.螺旋矩阵

题目:

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
LeetCode刷题——19.06.10_第3张图片

思路:

判断边界,只要rowBegin<=rowEnd并且colBegin 从左往右读完之后,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 spiralOrder(int[][] matrix) {
     ArrayList 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;
        
    }

你可能感兴趣的:(LeetCode)