Leetcode String 刷题笔记

String

1月16日

28 ? strStr() ? EASY

运用了string的substring方法和equals方法 str.substring(start包括,end不包括).equals(des);

14 ? 最长公共前缀 ? EASY

把第一个作为模版res,如果index(res)!=0则证明当前模版不是前缀,index(res)为-1代表不存在,用substring()方法把模版减少一位

58 ? 最后一个单词长度 ? EASY ♍️

?测试用例说如果string的末尾不是字母就一直跳过到字母,用Character.isLetter()

387 ? 字符串中的第一个唯一字符 ? EASY ♍️

先建立一个新的array把所有的char-'a'存入array中,再次for循环如果遇到了值为1的则是第一个唯一字符

383 ? 赎金信 ? EASY ♍️

  • 1.和387思路完全一致
  • 2.用.split("")把string变成array然后sort排序后再逐个比较

344 ? 反转字符串 ? EASY

先变成array再用双指针调换位置

  • 1.toCharArray()可以直接将string变成array
  • 2.new String(arr) 可以直接将array变成string

151 ? 反转字符串里的单词 ? MID

    1. 用trim()去除头尾的空格->用.split("\s+")去除中间的所有空格回车存进Array->用stringBuilder把单词逐个append(),StringBuilder比StringBuffer快,且不用新占内存,String每次要占用新内存 O(n) O(n)
    1. 先trim()->toStringArray()把整个字符串倒过来->依次倒转每个单词 O(n) O(1)

345 ? 反转字符串中的元音字母 ? EASY

双指针从两边向中间查找元音字母然后交换,需要注意的一点是str.contains()里的东西如果是char需要用char+""变成string O(n) O(1)

205 ? 同构字符串 ? EASY

  • 1.用HashMap->如果map.containsKey(a)而且map.get(a).equals(b)贼正确->如果没有a的话就.containsValue(b),如果也没有b就用map.put(a,b)
    1. 用array建立一个map,ASCII一共256位,建立一个512位的数组,从较低的256投射到较高的256位都设为i,如果再次出现则检查是否符合原投影

125 ? 验证回文串 ? EASY ♍️

双指针,和345思路完全相同,注意大小写str.toLowerCase(),注意是不是数字Character.isDigit()不能判定负数

1月17日

392 ? 判断子序列 ? MID ♍️

双指针

290 ? 单词模式 ? EASY ♍️

HashMap把字母和单词当作键值对存入,主要判定条件,可以更简便的方式来声明map:

Map map = new HashMap();
复制代码

49 ? 字母异位分组 ? MID

新建List<List>和HashMap<String,Integer>->用toCharArray,sort,new String把单词排序然后判断map里是否存在,如果存在就往list里的现存sublist加,如果不存在则新建sublist

1月21

242 ? 有效的字母异位 ? EASY

先判断长度是否相同,然后用字母表array存下来一个string加加,再用第二个string减减

20 ? 有效括号 ? EASY

建立一个stack来存取右边的括号,stack: push(), pop(), empty(), peek()

76 ? 最小覆盖字串 ? HARD

???Sliding Window.

class Solution {
    public String minWindow(String s, String t) {
        if(t.length()>s.length()||s==null) return ""; 
        int[] cnt = new int[128];
        for(char c : t.toCharArray()){
            cnt[c]++;
        }
        int from = 0;
        int min = Integer.MAX_VALUE;
        int total = t.length();
        for(int i=0, j=0; i<s.length(); i++){
            if(cnt[s.charAt(i)]-->0) total--;
            while(total==0){
                if(i-j+1<min){
                    min = i-j+1;
                    from = j;
                }
                if(++cnt[s.charAt(j++)]>0) total++;
            }
        }
        return (min==Integer.MAX_VALUE)? "":s.substring(from,from+min);
    }
}
复制代码

1月23日

30 ? 串联所有单词的子串 ? HARD

存到hashmap里,for循环(s-t).length,查看是否都符合hashmap里的词汇。

class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> list = new ArrayList<>();
        if(s==null || words==null || s.length()==0 ||words.length==0) return list;        
        HashMap<String, Integer> map = new HashMap<>();
        for(int i=0; i<words.length; i++){
            if(map.containsKey(words[i])){
                map.put(words[i], map.get(words[i])+1);
            }else{
                map.put(words[i], 1);
            }
        }
        for(int i=0; i<=s.length()-words.length*words[0].length();i++){
            HashMap<String, Integer> copy = new HashMap<>(map);
            int j = i;
            int count = words.length;
            while(count>0){
                String str = s.substring(j, j+words[0].length());
                if(!copy.containsKey(str)||copy.get(str)<=0){
                    break;
                }else{
                    copy.put(str, copy.get(str)-1);
                    j += words[0].length();
                    count--;
                }
            }
            if(count==0) list.add(i);
        }
        return list;
    }
}
复制代码

转载于:https://juejin.im/post/5c3fb2e8f265da61206210a1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值