数据结构与算法字符串经典题

Posted buptleida

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法字符串经典题相关的知识,希望对你有一定的参考价值。

翻转移位相关方法

右移

s = "abcd123" k = 3
Return "123abcd"

先分别将“abcd”和“123”翻转,再将整个字符串翻转,即可得到结果。

单词翻转

s = "I am a student"
Return "student a am I"

先分别将每个单词翻转,最后将整个句子进行翻转即得到结果

有效的字母异位词

LeetCode:有效的字母异位词

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例:

输入: s = "anagram", t = "nagaram"
输出: true

思想:

1.使用26位计数器
因为本题仅限于小写英文字母,所以使用26位数组来进行标记即可
2.map.getOrDefault(ch, 0)
若不存在则返回0。使用这个函数可稍微优化代码,不会太臃肿。
3.遍历String的优化写法

//方法一
for(int i=0;i<s.length();++i){
      char c = s.charAt(i);
}
//方法二
for(char ch : s.toCharArray()){
}

方法二比方法一性能好不少

代码:

我自己的蠢方法,使用hashmap但是特别不优雅

class Solution {
    public boolean isAnagram(String s, String t) {
        HashMap<Character,Integer> map = new HashMap<>();
        Integer v;
        for(int i=0;i<s.length();++i){
            char c = s.charAt(i);
            if((v = map.get(c))!=null){
                map.put(c,v+1);
            }else{
                map.put(c,1);
            }
        }
        for(int i=0;i<t.length();++i){
            char c = t.charAt(i);
            if((v = map.get(c))!=null){
                if(v==1) 
                    map.remove(c);
                else
                    map.put(c,v-1);
            }else{
                return false;
            }
        }
        return map.isEmpty();
    }
}

更加优化的hashmap写法:

public boolean isAnagram_2(String s, String t) {
    Map<Character, Integer> map = new HashMap<>();
    for (char ch : s.toCharArray()) {
        map.put(ch, map.getOrDefault(ch, 0) + 1);
    }
    for (char ch : t.toCharArray()) {
        Integer count = map.get(ch);
        if (count == null) {
            return false;
        } else if (count > 1) {
            map.put(ch, count - 1);
        } else {
            map.remove(ch);
        }
    }
    return map.isEmpty();
}

本题的标准做法:

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] arr = new int[26];
        for(char c:s.toCharArray()){
            arr[c-‘a‘] +=1;
        }
        for(char c:t.toCharArray()){
            arr[c-‘a‘] -=1;
        }
        for(int item : arr){
            if(item!=0) return false;
        }
        return true;
    }
}




以上是关于数据结构与算法字符串经典题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法(Java版) | 几个经典的算法面试题(下)

数据结构与算法(Java版) | 几个经典的算法面试题(下)

数据结构与算法(Java版) | 几个经典的算法面试题(下)

一文通数据结构与算法之——数组+常见题型与解题策略+Leetcode经典题

数据结构与算法数组与矩阵经典题

一文通数据结构与算法之——贪心算法+常见题型与解题策略+Leetcode经典题