【LeetCode】部分题目

LeetCode

记录一些自己的做题历程

14.最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:

所有输入只包含小写字母 a-z

思路:横向对比,先将数组化成第一个字符串数组,之后将后面的每一个字符串和第一个进行对比分析,得出结论。

20.有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

思路:利用str.replace()方法,替换三种情况的括号成空字符,之后看结束的字符串是否是空字符串,如果是,则为有效的括号,否则是无效的括号。

s = s.replace("()", "").replace("[]", "").replace("{}", "");

389.找不同

389. 找不同

给定两个字符串 st,它们只包含小写字母。

字符串 *t* 由字符串 *s* 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

示例 2:

输入:s = "", t = "y"
输出:"y"

示例 3:

输入:s = "a", t = "aa"
输出:"a"

示例 4:

输入:s = "ae", t = "aea"
输出:"a"

提示:

  • 0 <= s.length <= 1000
  • t.length == s.length + 1
  • st 只包含小写字母

思路:直接将字符转换成字符数组之后,用int类型变量存下两字符串ASCII码值的和,相减即可求出对应的结果,最后答案进行转换即可。转换步骤:

int tempS = 0, tempT = 0;
char[] strS = s.toCharArray();
char[] strT = t.toCharArray();
int length = strS.length;
for (int i = 0; i < length; i++) {
    tempS += strS[i] + 0;
    tempT += strT[i] + 0;
}
tempT += strT[length];

char ans = (char)(tempT - tempS);
return ans;

3.无重复字符的最长子串

3. 无重复字符的最长子串

难度中等4640

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例 4:

输入: s = ""
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

思路:

利用ArrayList做出解答,将题目中的最长字符串找出来。开始的时候,打算使用ArrayList中的removeRange方法,后来编译的时候发现无法通过,才知道该方法默认被屏蔽使用。

之后找寻到另外一种思路。假如字符串是

“dvdf”

那么我应该从【1】的位置开始,一共3个长度的子串。但是从开始遍历的过程中,会发现在找到【2】的位置的时候,需要更新ArrayList,所以创建三个变量。

第一个是int flag = ans.indexOf(str[i]) + 1;,找出dArrayList中出现的位置;

第二个是int size = ans.size();,暂存原本的长度;

第三个是int temp = size - flag;,找出需要更新的部分,将ArrayList进行更新。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] str = s.toCharArray();
        int length = str.length;
        int num = 0;
        int ansNum = 0;
        if (length == 0) {
            return num;
        } else {
            ArrayList ans = new ArrayList();
            for (int i = 0; i < length; i++) {
                // 如果ans中包含该元素,则清除子串
                if (ans.contains(str[i])) {
                    // 清空arraylist操作:ans.clear();
                    // 该方法被屏蔽使用
                    // ans.removeRange(0, ans.indexOf(str[i]) + 1);
                    int flag = ans.indexOf(str[i]) + 1;
                    int size = ans.size();
                    int temp = size - flag;
                    ans.clear();
                    for (int j = i - temp; j <= i; j++) {
                        ans.add(str[j]);
                    }
                    num = ans.size();
                } else {
                    // 不含有则是子串中的一个字符,添加进去即可
                    ans.add(str[i]);
                    num++;
                }
                ansNum = Math.max(num, ansNum);
            }
        }
        return ansNum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值