LeetCode刷题——19.06.10

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;
        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值