码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-05-30 10:57:16      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:pre   ble   标准   toc   else   problems   ISE   http   移位   

翻转移位相关方法

右移

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;
    }
}

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

标签:pre   ble   标准   toc   else   problems   ISE   http   移位   

原文地址:https://www.cnblogs.com/buptleida/p/12991090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!