【LeetCode】部分题目
LeetCode
记录一些自己的做题历程
14.最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""
。示例 1:
输入: ["flower","flow","flight"] 输出: "fl"
示例 2:
输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母
a-z
。
思路:横向对比,先将数组化成第一个字符串数组,之后将后面的每一个字符串和第一个进行对比分析,得出结论。
20.有效的括号
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
思路:利用str.replace()
方法,替换三种情况的括号成空字符,之后看结束的字符串是否是空字符串,如果是,则为有效的括号,否则是无效的括号。
s = s.replace("()", "").replace("[]", "").replace("{}", "");
389.找不同
389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 *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
s
和t
只包含小写字母
思路:直接将字符转换成字符数组之后,用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;
,找出d
在ArrayList
中出现的位置;
第二个是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;
}
}