字符串经典问题

news2024/11/14 23:17:31

1. 验证回文串

验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例 1:

输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串。

1.1 先转换为都是小写的字符串,然后比较是否是回文串

首先根据题目的条件,先使用StringBuilder来存储小写字符串,如果s里面不是小写那么就跳过,可以使用Character.isLetterOrDigit()判断是否为字符,然后使用toLowerCase转换成小写,然后就都是小写的字符串,进行字符串回文比较。

    public boolean isPalindrome(String s) {
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<s.length();i++){
            char c =s.charAt(i);
            if(Character.isLetterOrDigit(c)){
                sb.append(Character.toLowerCase(c));
            }
        }
        String str = sb.toString();
        int left =0;
        int right = str.length()-1;
        while(left<right){
            if(str.charAt(left) != str.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

在这里插入图片描述
总的时间复杂度时O(n),空间复杂度O(n)

不过这里我还有个想法,就是一次循环,碰到,空格就跳过,然后将字符转为小写使用双指针进行比较,这样就可以使用一次遍历。

1.2 一次循环

  public boolean isPalindrome(String s) {
        int n =s.length();
        int left =0;
        int right = n-1;
        while(left<right){
            while(left<right && !Character.isLetterOrDigit(s.charAt(left))){
                ++left;
            }
            while(left<right && !Character.isLetterOrDigit(s.charAt(right))){
                --right;
            }
            if(left<right){
                if(Character.toLowerCase(s.charAt(left) ) != Character.toLowerCase(s.charAt(right))){
                    return false;
                }
                ++left;
                --right;
            }
        }

        return true;
    }

这一题如果知道了isLetterOrDigit,就比较简单了,不需要使用额外的判断。

2. 字符串中的第一个唯一字符

字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:

输入: s = “leetcode”
输出: 0
示例 2:

输入: s = “loveleetcode”
输出: 2
示例 3:

输入: s = “aabb”
输出: -1

2.1 HashMap

统计每个字符出现的次数,使用hashmap比较合适,然后遍历字符串找到对应的map里面值为1的结果,就是不重复的字符。

    public int firstUniqChar(String s) {
        HashMap<Character,Integer> map = new HashMap<>();
        for(int i=0;i<s.length();i++){
            map.put(s.charAt(i),map.getOrDefault(s.charAt(i),0)+1);
        }
        for(int i=0;i<s.length();i++){
            if(map.get(s.charAt(i))==1){
                return i;
            }
        }
        return -1;
    }

3. 有效的字母异位词

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

3.1 字符数组排序

刚看到这个方法的时候还是有点没想到,因为将字符经过排序后都是按照一定顺序排列的,只需要将两个字符串排序后的结果比较就可以了。

    public boolean isAnagram(String s, String t) {
        char [] ch1 = s.toCharArray();
        char [] ch2 = t.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        return new String(ch1).equals(new String(ch2));
    }

3.2 哈希表

题目提示了统计字符出现的次数,很显然使用哈希表。

    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()) return false;
        char [] ch1 = s.toCharArray();
        Map<Character,Integer> map1 = getMapStr(s);
        Map<Character,Integer> map2 = getMapStr(t);
        for(char ch: ch1){
            if(!map2.containsKey(ch) || map1.get(ch) != map2.get(ch)){
                return false;
            }
        }
        return true;
        
    }

    private Map<Character,Integer> getMapStr(String str){
        char [] chars = str.toCharArray();
        Map<Character,Integer> map = new HashMap<>();
        for(char ch:chars){
            map.put(ch,map.getOrDefault(ch,0)+1);
        }
        return map;
    }

但是这个方法在力扣里面测试有个数据跑不通。

3.3 哈希映射

首先先设置一个26位长的数组,然后这个数组里面下标就对应着字符串里面的下标,然后每次遍历的时候都要将同一个位置的元素如果s里面存在那么数组对应元素的个数就自增,t里面也对应这个元素就自减,如果最后每位上的元素值都是0,就意味着是一样的。

    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()) return false;
        int  [] res = new int [26];
        for(int i=0;i<s.length();i++){
            res[s.charAt(i) - 'a']++;
            res[t.charAt(i) - 'a']--;
        }

        for(int i=0;i<26;i++){
            if(res[i]!=0){
                return false;
            }
    }
           return true;
}   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/907536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Jenkins构建生产CICD环境(上篇)

目录 环境概述 Jenkins简介 持续集成 持续集成的效益 持续集成的作用 持续集成的特点 持续交付 持续部署 Maven 介绍 安装配置Jenkins Jenkins配置 1、修改jenkins初始密码 2、安装 Jenkins 必要插件 环境概述 随着软件开发需求及复杂度的不断提高&#xff0c;团队…

【vue】更改角色权限后,实现页面不刷新更改其可展示的导航菜单

登入的角色本身属于领导级别&#xff08;集团权限&#xff09;&#xff0c;没有下级的不同权限&#xff1a; 切换不同身份&#xff08;公司&#xff09;&#xff0c;以获得相应部门的不同导航菜单及权限 这里实现&#xff1a;更改角色权限后&#xff0c;实现页面 不刷新 更改…

Bigemap如何添加最新地图?

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 打开软件&#xff0c;要提示需要授权和添加地图&#xff0c;需要授权可以联系客服处理&#xff0c;然后点击选择地图这个按钮&#xff0c;列表中有个添加按钮点进去选择…

这款Linux不收费,却赢得了江湖!

Linux也好&#xff0c;开源也好&#xff0c;近些年犹如翻涌的漩涡&#xff0c;狂热非常&#xff0c;争论不断。从去年高人气开源 npm 包“colors”与“faker”被作者恶意引进错误内容&#xff0c;再到近期的红帽修改公共版的RHEL源代码的发布规则&#xff0c;都在业内引起了不小…

SpringBoot整合Mybatis Plus——条件构造器Wrapper

Mybatis Plus为我们提供了如下的一些条件构造器&#xff0c;我们可以利用它们实现查询条件、删除条件、更新条件的构造。 条件构造器 | MyBatis-Plus (baomidou.com) 一、通过maven坐标引入依赖&#xff08;注意版本&#xff01;&#xff01;&#xff09; <dependency>…

Vulnhub: ICMP: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.208 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.208 80端口的cms为Monitorr 1.7.6m 搜索发现该版本的cms存在远程代码执行 searchsploit monitorr 漏洞利用 nc本地监听&…

GEE-PIE遥感大数据处理与典型案例教程

详情点击链接&#xff1a;GEE-PIE遥感大数据处理与典型案例教程 一&#xff1a;GEE和PIE遥感云平台 1.GEE和PIE平台及典型应用案例 2.JavaScript基础&#xff0c;包括变量&#xff0c;运算符&#xff0c;数组&#xff0c;判断及循环语句等 3.遥感云重要概念与典型数据分析流程…

水电站数字孪生三维可视化展示开发

一、智慧污水处理厂数字孪生系统 智慧污水处理厂结合视频识别、机器人、BIM、互联网、物联网、云计算及大数据等技术&#xff0c;在前期进行精细化设计&#xff0c;实现水质达标&#xff0c;安全生产、高效节能等生产、运营和管理目标&#xff0c;从而达到提升城市生活污水处理…

深度学习实战49-基于卷积神经网络和注意力机制的汽车品牌与型号分类识别的应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战49-基于卷积神经网络和注意力机制的汽车品牌与型号分类识别的应用,该项目就像是一只智慧而敏锐的眼睛,专注地凝视着汽车世界。这个项目使用PyTorch作为强有力的工具,提供了一个深度学习的舞台,让我们能够设计和训练一个…

qiiuzhiji4

本篇是从慧与离职后到2023年8月21日这段时间的经历 2023/7/31至2023/8/21 本篇初次写于2023年8月21日 从慧与离职后基本上就是在专心找工作了&#xff0c;但是有在这段时间找工作经历的人都明白&#xff0c;IT行业不复以往了。尤其是对于我这样的普通二本学历的人来说&#xff…

CW4-6A-S、CW4-10A-S、CW4-20A-S、CW4-30A-S螺栓式滤波器

CW3L2-3A-S、CW3L2-6A-S、CW3L2-10A-S、CW3L2-20A-S CW3-3A-S、CW3-6A-S、CW3-10A-S、CW3-20A-S、CW3-30A-S CW4EL2-3A-S、CW4EL2-6A-S、CW4EL2-10A-SCW4EL2-20A-S、CW4EL2-30A-S CW4E-3A-S、CW4E-6A-S、CW4E-10A-S、CW4E-20A-S、CW4E-30A-S CW4E-40A-S(001)、CW4E-50A-S(0…

Lnton羚通算法算力云平台在环境配置中Windows10终端和VSCode下如何打开Anaconda-Prompt

在Windows 10的终端和VSCode中&#xff0c;可以直接打开Anaconda Prompt。下面是两种方法&#xff1a; Windows 10终端&#xff1a;在开始菜单中搜索"Anaconda Prompt"&#xff0c;然后点击打开。这将启动Anaconda Prompt终端&#xff0c;你可以在其中执行conda相关命…

得帆创始人张桐:低代码平台的定位和解答

很多朋友都有疑问&#xff1a;得帆服务了非常多的500强大型企业&#xff0c;是不是只有大型企业才能把低代码用好&#xff1f;是不是只有大型企业才能用低代码提升效率和降低成本&#xff1f;是不是大型企业才有经济实力去购买和使用低代码软件&#xff1f;低代码&#xff0c;零…

【现场问题】arthas,线上查看某一个类的,某一个方法,入参是什么【类似于断点操作】

arthas arthas下载方式方法 arthas下载 我的链接。免费的放心下 方式方法 watch 类名 方法名 -b “{params}” -x 3 这里的3 是指 第几个层级 watch org.apache.dolphinscheduler.api.service.ExecutorService startCheckByProcessDefinedId -b "{params}" -x 3…

6篇 ICML 2023 杰出论文解析,涉及无学习率、LLM水印、域泛化等方向

ICML 全称 International Conference on Machine Learning&#xff0c;由国际机器学习学会&#xff08;IMLS&#xff09;举办&#xff0c;是计算机人工智能领域的顶级会议。今年的 ICML 大会已是第 40 届&#xff0c;共收到 6538 份投稿&#xff0c;有1827 份被接收&#xff0c…

速通蓝桥杯嵌入式省一教程:(七)定时器输入捕获中断与PWM频率占空比测量

前文已经讲述过定时器的两个用法&#xff1a;基本定时中断与PWM输出。本节接着介绍第三种用法&#xff1a;定时器输入捕获中断。 在此之前&#xff0c;需要解释一下前文一直出现过的与定时器有关的概念。 定时器(TIMER)&#xff1a;所谓定时器&#xff0c;其基本功能就是定时…

strstr的学习与使用及实现/查找字符串中的字符

在字符串中查找字符或字符串 strstr函数传入两个字符串&#xff0c;并返回查找后的首地址&#xff0c;找不到返回NULL 模拟实现 char* my_strstr( char* str1, const char* str2) {int i, j;assert(str1 && str2);//断言判断一下for ( i 0; i < strlen(str1); i){f…

【G-LAB】网络工程师常用排错命令详细版

网络工程师在日常配置中难免出现各种配置错误&#xff0c;比如接口地址配错、掩码位数配错、接口忘记no shutdown。除去这些基础错误&#xff0c;在配置各种路由选择协议时也会因为网络类型、邻居类型、区域和路由器层级等各种问题使邻居无法建立、路由无法传递进而导致网络不通…

Apipost中自定义接口字段如何配置

Apipost项目设置中可以配置接口文档中的自定义接口字段&#xff0c;创建状态码字典。分享分档时会展示到文档页面 状态码字典 在状态码字典中可以自定义状态码即其含义 自定义的状态码会在分享的API文档中展示 接口属性 接口属性中可以自定义接口和接口文档展示字段&#xf…

使用Python批量将飞书文档转为MD

说明&#xff1a;飞书是在线文档平台&#xff0c;本文介绍如何使用Python程序批量将飞书文档转为MD文档&#xff0c;并下载到本地&#xff1b; 复制地址 首先&#xff0c;把文档的URL都复制下来&#xff0c;这个需要一个一个点&#xff0c;并复制拷贝&#xff0c;但却是工作量…