2026/1/9 5:02:48
网站建设
项目流程
做c2c网站的弊端,湘西网站建设公司,设计非常好的网站,网站外链什么时候做LeetCode 100天挑战 Day 1#xff1a;字符串匹配与Z字形变换
目录
题目一#xff1a;实现strStr函数题目二#xff1a;Z字形变换总结 前言
欢迎来到我的LeetCode算法100天挑战专栏#xff01;在接下来的100天里#xff0c;我会每天分享两道LeetCode题目的解析。今天我们…LeetCode 100天挑战 Day 1字符串匹配与Z字形变换目录题目一实现strStr函数题目二Z字形变换总结前言欢迎来到我的LeetCode算法100天挑战专栏在接下来的100天里我会每天分享两道LeetCode题目的解析。今天我们来看两道字符串处理的题目。题目一实现strStr函数题目描述给你两个字符串 haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标下标从 0 开始。如果 needle 不是 haystack 的一部分则返回 -1。示例 1输入haystack sadbutsad, needle sad 输出0 解释sad 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 所以返回 0。示例 2输入haystack leetcode, needle leeto 输出-1 解释leeto 没有在 leetcode 中出现所以返回 -1。解题思路这道题的思路很直接遍历haystack字符串从每个位置开始检查是否能匹配needle如果找到匹配返回当前位置如果遍历完都没找到返回-1代码实现分析classSolution{publicintstrStr(Stringhaystack,Stringneedle){intlen1haystack.length();intlen2needle.length();// 从haystack的每个位置开始检查for(inti0;ilen1-len2;i){// 提取从i开始的长度为len2的子串和needle比较if(needle.equals(haystack.substring(i,ilen2))){returni;}}return-1;}}代码逐行解释int len1 haystack.length();- 获取haystack的长度int len2 needle.length();- 获取needle的长度for(int i 0; i len1 - len2; i)- 遍历haystacki代表当前检查的起始位置循环条件确保不会越界比如haystack长度是8needle长度是3只需要检查到位置5即可haystack.substring(i, i len2)- 提取子串needle.equals(...)- 比较字符串是否相等找到匹配返回位置否则返回-1测试用例示例1haystack “sadbutsad”, needle “sad”i 0: substring(0, 3) “sad”匹配成功返回 0示例2haystack “leetcode”, needle “leeto”遍历所有可能位置都不匹配返回 -1题目二Z字形变换题目描述将一个给定字符串 s 根据给定的行数 numRows 以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时排列如下P A H N A P L S I I G Y I R之后你的输出需要从左往右逐行读取产生出一个新的字符串比如“PAHNAPLSIIGYIR”。示例 1输入s PAYPALISHIRING, numRows 3 输出PAHNAPLSIIGYIR示例 2输入s PAYPALISHIRING, numRows 4 输出PINALSIGYAHRPI 解释 P I N A L S I G Y A H R P I解题思路这个题目需要模拟Z字形排列的过程首先计算需要多少列来容纳所有字符创建一个二维数组来模拟Z字形排列按照Z字形的规律填充字符最后按行读取结果Z字形排列的规律垂直向下从第0行到第numRows-1行斜向上从第numRows-2行到第1行重复这个过程代码实现分析classSolution{publicStringconvert(Strings,intnumRows){// 特殊情况只有一行时直接返回原字符串if(numRows1){returns;}intindex0;// 当前处理到字符串的哪个位置intcycleLen2*numRows-2;// 一个完整周期的长度intcycleColsnumRows-1;// 一个完整周期占的列数intfullCycless.length()/cycleLen;// 完整周期数intremainders.length()%cycleLen;// 剩余字符数// 计算需要的列数intlistfullCycles*cycleCols;if(remainder0){list;if(remaindernumRows){list(remainder-numRows);}}// 创建二维数组存储Z字形char[][]tempnewchar[numRows][list];inthight0;// 填充Z字形for(inti0;ilist;i){if(indexs.length()){break;}// 垂直向下的列if(i%(numRows-1)0){for(hight0;hightnumRowsindexs.length();hight){temp[hight][i]s.charAt(index);index;}hightnumRows-1;continue;}else{// 斜向上的列hight--;temp[hight][i]s.charAt(index);index;}}// 按行读取结果Stringans;for(inti0;itemp.length;i){for(intj0;jlist;j){if(temp[i][j]!0){anstemp[i][j];}}}returnans;}}代码逐行解释特殊情况处理if(numRows1){returns;}只有一行时Z字形就是原字符串。计算基本参数intcycleLen2*numRows-2;// 一个完整周期的长度intcycleColsnumRows-1;// 一个完整周期占的列数周期长度向下numRows-1步向上numRows-1步周期列数需要numRows-1列计算所需列数intfullCycless.length()/cycleLen;intremainders.length()%cycleLen;intlistfullCycles*cycleCols;计算完整周期和剩余字符需要的列数。创建二维数组char[][]tempnewchar[numRows][list];填充Z字形if(i%(numRows-1)0){// 垂直向下的列for(hight0;hightnumRowsindexs.length();hight){temp[hight][i]s.charAt(index);index;}}else{// 斜向上的列hight--;temp[hight][i]s.charAt(index);index;}垂直列从上到下填充斜向列只有一个字符位置逐渐上移按行读取结果Stringans;for(inti0;itemp.length;i){for(intj0;jlist;j){if(temp[i][j]!0){anstemp[i][j];}}}示例分析示例1s “PAYPALISHIRING”, numRows 3Z字形排列P A H N A P L S I I G Y I R按行读取PAHNAPLSIIGYIR总结今天的两道题目都是字符串处理的基础题目strStr函数考察字符串的基本操作和边界处理Z字形变换考察二维数组的模拟和规律发现两道题都需要仔细处理边界条件通过模拟实际过程来解决问题。这种思路在解决算法问题时很有用。标签#LeetCode #算法 #Java #字符串 #数组