LeetCode-字符串专题
LeetCode-字符串专题
牡蛎给芝加哥带来了海
talk is cheap,show me the code.
展开
-
【Leetcode-字符串】盛最多水的容器
盛最多水的容器难度:中等这道题用双指针求解,难点在于需要理解为什么双指针求解时不会漏掉某些情况,我表述能力有限,贴一下大神的讲解用一句话概括双指针解法的要点:指针每一次移动,都意味着排除掉了一个柱子。如下图所示,在一开始,我们考虑相距最远的两个柱子所能容纳水的面积。水的宽度是两根柱子之间的距离 d = 8d=8;水的高度取决于两根柱子之间较短的那个,即左边柱子的高度 h = 3h=3。水的面积就是 3 * 8 = 24如果选择固定一根柱子,另外一根变化,水的面积会有什么变化吗?稍加思考可得:原创 2022-01-14 18:05:58 · 56 阅读 · 0 评论 -
【Leetcode-字符串】电话号码的字母组合
电话号码的字母组合难度:中等今天的每日一题 累加数运用到了dfs(深度优先算法),因为之前对这个算法不太了解,所以看了一些视频和博客,所以打算先拿这道题来试试水。运用dfs求解的核心在于两点:1、找到截止条件2、找出“候选人”并筛选在这道题中,我们的截止条件为遍历的下标==字符串长度,而**“候选人”为数字对应的字母**。代码如下: //定义一个char二维数组,外层为手机上的按键数字,内层为数字对应的字母 static char[][] ch = new char[][]{原创 2022-01-10 19:43:30 · 186 阅读 · 0 评论 -
【Leetcode-字符串】组合总和
组合总和难度:中等为了加深对dfs的理解,又找了题来练练手。同样的思路,运用dfs求解的核心在于两点:1、找到截止条件2、找出“候选人”并筛选这道题的截止条件为数组中的数字总和大于target,而候选人则为candidates数组中的任意元素,因为题干中提到元素可以多次使用,则无筛选条件代码如下: public List<List<Integer>> combinationSum(int[] candidates, int target) { Lis原创 2022-01-10 16:19:54 · 252 阅读 · 0 评论 -
【Leetcode-字符串】有效的括号
有效的括号难度:简单将括号的映射关系存入哈希map中,注意key为右括号(因为后面需要根据右括号获取左括号),遍历字符串,当遍历到左括号时,存入栈中,当遍历到右括号时,从栈顶取出一个元素(若栈中此时没有元素,意味着右括号先单独出现了,返回false),与右括号对应的左括号判断是否相等,若不相等则返回false,遍历完字符串后,若栈中元素不为空,则返回false,反之返回true。 static Map<Character,Character> map = new HashMap(){{原创 2022-01-07 15:58:10 · 292 阅读 · 0 评论 -
【Leetcode-字符串】最长特殊序列 Ⅰ
最长特殊序列 Ⅰ难度:简单与其说是算法题,不如说是一道脑筋急转弯。根据题意独有指的是只有自己有,另一个字符串没有那么当两个字符串长度不相等时,直接返回较长的字符串长度即可若两个字符串相同,则返回-1若两个字符串长度相等但字符串不相同,因任意一个字符串即都是自己独有的子串,又都不是对方的字串,所以返回它们任一的长度即可。代码如下: public static int findLUSlength(String a, String b) { if (a.equals(b)){原创 2022-01-07 15:00:17 · 205 阅读 · 0 评论 -
【Leetcode-字符串】检测大写字母
检测大写字母难度:简单由题意可知符合条件的字符串有两种情况:1、所有字符全大写2、除首字母外,所有字符全小写代码如下: public boolean detectCapitalUse(String word) { boolean flag = true; //先判断是否全大写 for (int i = 0; i < word.length(); i++) { if (word.charAt(i)>=97){原创 2022-01-05 21:08:01 · 365 阅读 · 0 评论 -
【Leetcode-字符串】键盘行
键盘行难度:简单判断字符串数组中的每个字符串是否在键盘的同一行,声明一个字符串数组strs,单个字符串表示键盘上每一行的英文字母(注意大小写),遍历题目中输入的字符数组,记录每个字符串第一个字符在 strs 中所属的字符串,判断后续字符是否也在该字符串中。代码如下: static String[] strs = new String[]{"qwertyuiopQWERTYUIOP","asdfghjklASDFGHJKL","zxcvbnmZXCVBNM"}; public String原创 2022-01-05 21:02:14 · 504 阅读 · 0 评论 -
【Leetcode-字符串】密钥格式化
密钥格式化难度:简单思路:从后往前遍历字符串,忽略字符“-”,每当字符串长度对k取模为0时,添加字符“-”。代码如下: public String licenseKeyFormatting(String s, int k) { int cnt = 0; StringBuilder sb = new StringBuilder(); for (int i = s.length()-1; i >= 0; i--) { if原创 2022-01-03 15:17:09 · 804 阅读 · 0 评论 -
【Leetcode-字符串】重复的子字符串
重复的子字符串难度:简单判断一个字符串是否存在一个子串重复构成,那么需要满足以下两点:1、字符串以该子串开头2、子串的长度是字符串长度的正因数(也就是能被整除)代码如下: public static int countSegments(String s) { if (s.length()==1){ return false; } for (int i = 1; i <= s.length()/2; i++) {原创 2022-01-01 17:29:46 · 509 阅读 · 0 评论 -
【Leetcode-字符串】字符串中的单词数
字符串中的单词数难度:简单这道题本质上是求空字符的数量,但是有两个问题需要注意:问题1:当只有一个单词时,可以没有空字符;问题2:当出现连续空字符时,应该只累计为1个空字符;写的时候有点顾此失彼,可能今天跨年所以心思也没有很集中,所以最后没做出来,参考了题解的做法,通过在原字符串上的最前面加一个空字符串,就可以很巧妙的避开问题1,后续遍历判断当前字符非空 且 前一个字符为空 则+1,通过两个条件来规避问题2代码如下: public static int countSegments(Strin原创 2021-12-31 22:28:26 · 217 阅读 · 0 评论 -
【Leetcode-字符串】字符串相加
字符串相加难度:简单这道题需要我们模拟加法的运算过程,从两个字符串最后一位开始运算,还需要考虑进位。代码如下: public List<String> fizzBuzz(int n) { int length1 = num1.length()-1; int length2 = num2.length()-1; int jin = 0; StringBuilder sb = new StringBuilder();原创 2021-12-31 21:55:12 · 344 阅读 · 0 评论 -
【Leetcode-字符串】Fizz Buzz
Fizz Buzz难度:简单这道题纠结了一下要不要发博客哈哈,但还是想着做过的题就要记录一下,思路是遍历分别对15、5、3取余作判断就可以了代码如下: public List<String> fizzBuzz(int n) { List<String> list = new ArrayList<>(); for (int i = 1; i <= n; i++) { if (i%15==0){原创 2021-12-31 20:55:11 · 363 阅读 · 0 评论 -
【Leetcode-字符串】最长回文串
最长回文串难度:简单这道题比较简单,找出最长的回文串,其实就是找出有多少对相同的字符,把相同的字符放两边,如果字符串中还有剩余单独的字符,中间还可以多放一个。那我们可以利用一维数组存放每个字符出现的次数,再遍历一维数组,累加出现 大于2的次数(注意:当出现奇数次需要-1,比如出现次数为9,那实际上能累加到的长度应该为8),最后再判断res与字符串长度是否相等,若不相等则再**+1**返回(回文串中间的元素可以只出现1次)代码如下: public static int longestPalindrom原创 2021-12-30 23:41:43 · 187 阅读 · 0 评论 -
【Leetcode-字符串】找不同
找不同难度:简单这道题比较简单,有两种方法求解:第一种:利用一维数组计数,长的字符串遍历 +1,短的字符串遍历 -1,最后取出数组中值为1的下标,转成char类型返回。代码如下: public boolean canConstruct(String ransomNote, String magazine) { int[] num = new int[128]; for (int i = 0; i < t.length(); i++) {原创 2021-12-29 18:39:08 · 128 阅读 · 0 评论 -
【Leetcode-字符串】字符串中的第一个唯一字符
字符串中的第一个唯一字符难度:简单这道题比较简单,用一维数组求解即可代码如下: public boolean canConstruct(String ransomNote, String magazine) { int[] num = new int[128]; for (int i = 0; i < s.length(); i++) { num[s.charAt(i)]++; }原创 2021-12-29 18:18:14 · 47 阅读 · 0 评论 -
【Leetcode-字符串】赎金信
赎金信难度:简单定义一个映射关系map数组,先遍历字符串magazine中的字符,将它们对应的ascii码作为下标,数组的值则记录该字符出现的次数,每次都+1。最后我们得到一个数组,里面存储了各个字符出现的次数。紧接着遍历字符串ransomNote,当遍历到的字符的ascii码作为下标在map数组中的值为0时,返回false,若不为false,该值 -1,当遍历结束则返回true。代码如下: public boolean canConstruct(String ransomNote, Strin原创 2021-12-29 17:23:11 · 184 阅读 · 0 评论 -
【Leetcode-字符串】反转字符串中的元音字母
反转字符串中的元音字母难度:简单利用双指针扫描,当左右指针都是元音字母时,进行互换并移到下一位这里借鉴了下大神的写法,使用容器将元音字母存储,并使用 static 修饰,确保整个容器的创建和元音字母的填入在所有测试样例中只会发生一次。缩短了执行用时。代码如下:class Solution { static char[] vowels = new char[]{'a','e','i','o','u'}; static Set<Character> set = new原创 2021-12-28 16:30:32 · 247 阅读 · 0 评论 -
【Leetcode-字符串】反转字符串
反转字符串难度:简单希望面试都能遇到这种题哈哈代码如下: public static void reverseString(char[] s) { for (int i = 0; i < s.length/2; i++) { char temp = s[i]; s[i] = s[s.length-1-i]; s[s.length-1-i] = temp; } }执行结果:通过原创 2021-12-27 20:30:13 · 52 阅读 · 0 评论 -
【Leetcode-字符串】单词规律
单词规律难度:简单先对字符串s按" "作 切割 成字符数组 s1,比较字符串pattern和数组s1的长度是否相等,不相等直接返回false,定义一个哈希表map,接着遍历字符串和数组,将字符串和数组中的元素作为映射关系放入map中。其中注意规避key不同但value相同的情况。代码如下: public static boolean wordPattern(String pattern, String s) { String[] s1 = s.split(" ");原创 2021-12-27 20:21:15 · 134 阅读 · 0 评论 -
【Leetcode-字符串】有效的字母异位词
有效的字母异位词难度:简单首先判断两个字符串长度是否相等,不相等则直接返回 false,初始化数组map,遍历字符串 s 和 t,s 负责在对应的位置 +1,t 负责在对应的位置 -1,最后遍历map中是否存在不为0的元素,若存在,则返回false,不存在则返回true public static boolean isAnagram(String s, String t) { if (s.length()!=t.length()){ return false;原创 2021-12-27 19:51:06 · 118 阅读 · 0 评论 -
【Leetcode-字符串】同构字符串
同构字符串难度:简单定义哈希表map,遍历字符串 s 和 t,将s作为键、t作为值存入map中。当出现重复key时,判断当前t的字符与map中的是否相等,不相等则返回false,遍历结束返回true。注意,当key值不存在map时,我们会将当前s遍历到的字符和t遍历到的字符存入map中,在此之前,我们需要判断当前value是否存在,若存在,则也需要返回false public static boolean isIsomorphic(String s, String t) { if原创 2021-12-24 22:30:52 · 321 阅读 · 0 评论 -
【Leetcode-字符串】Excel表列名称
Excel表列名称难度:简单不断地对 columnNumber 进行 % 运算 取得最后一位,然后对 columnNumber 进行 / 运算,将已经取得的位数去掉,直到 columnNumber为 0 即可。注意:本题需要我们将从 11 开始,因此在执行「进制转换」操作前,我们需要先对 columnNumber执行减 1 操作,从而实现整体偏移。代码如下: public static String convertToTitle(int columnNumber) { int原创 2021-12-22 20:06:31 · 446 阅读 · 0 评论 -
【Leetcode-字符串】验证回文串
验证回文串难度:简单这道题我用双指针做,一个指向 头,一个指向 尾,遍历判断相等就行了,记得处理下特殊字符代码如下 public String addBinary(String a, String b) { String lowerCase = s.toLowerCase(); int left = 0; int right = s.length()-1; while(left<right){ if (!原创 2021-12-22 19:30:02 · 292 阅读 · 0 评论 -
【Leetcode-字符串】二进制求和
二进制求和难度:简单这道题对我来说有点难,感觉需要写很多判断…所以放弃了,看了题解,思路是:在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转 public String addBinary(String a, String b) { StringBuilder ans = new StringBuilder(); //ca为是否需要进一的标识 int ca = 0; for(int i = a.length() - 1原创 2021-12-22 19:09:38 · 331 阅读 · 0 评论 -
【Leetcode-字符串】最长公共前缀
刷了三周的数组简单题,周末花时间把题目重新过了一遍接下来开始刷字符串相关的题目最长公共前缀难度:简单思路:将第一个单词作为前缀 res,遍历数组,当出现不以 res开头的字符串时,res减去最末尾的一个字母再重新开始遍历代码实现如下: public static int lengthOfLastWord(String s) { String res = strs[0]; for (int i = 1;i<strs.length;i++){原创 2021-12-22 18:53:12 · 307 阅读 · 0 评论 -
【Leetcode-字符串】最后一个单词的长度
刷了三周的数组简单题,周末花时间把题目重新过了一遍接下来开始刷字符串相关的题目最后一个单词的长度难度:简单题目求最后一个单词长度,思路:把字符串最后的空格去掉,再累计非空的长度。代码实现如下 public static int lengthOfLastWord(String s) { int p = s.length()-1; //计算字符串末端空格的长度 while (s.charAt(p)==' '){ p--;原创 2021-12-21 19:32:40 · 165 阅读 · 0 评论