算法通关村第12关【白银】| 字符串经典问题

一、反转问题

1.反转字符串

思路:双指针,反转数组一个套路

class Solution {public void reverseString(char[] s) {int l = 0;int r = s.length -1;while(l<r){char c = s[l];s[l] = s[r];s[r] = c;l++;r--;}}
}

2.k个一组反转

思路:每k个进行一次反转函数,从i++变成i+=2*k

class Solution {public String reverseStr(String s, int k) {if(s == null || s.length() == 0){return s;}int len = s.length();char[] str = s.toCharArray();for(int i = 0;i<len;i+=2*k){revers(str,i,Math.min(i+k-1,len-1));}return new String(str);}public void revers(char[] s,int l,int r){while(l<r){char c = s[l];s[l] = s[r];s[r] = c;l++;r--;}}
}

3.仅仅反转字母

思路:

方法一、双指针

class Solution {public String reverseOnlyLetters(String s) {if(s==null || s.length() == 0){return s;}int l = 0;int r = s.length() -1;char[] str = s.toCharArray();while(l<r){while(l<str.length&&!Character.isLetter(str[l])){l++;}while(r>=0&&!Character.isLetter(str[r])){r--;}if(l<r){char c = str[l];str[l] = str[r];str[r] = c;l++;r--;}}return new String(str);}
}

方法二、使用栈,实现出栈反转

字母压入栈中,遇到字母弹出栈顶拼接进结果集

class Solution {public String reverseOnlyLetters(String s) {if(s==null || s.length() == 0){return s;}char[] str = s.toCharArray();Stack<Character> stack = new Stack();for(int i = 0;i<str.length;i++){if(Character.isLetter(str[i])){stack.push(str[i]);}}StringBuilder sb = new StringBuilder();for(char c : str){if(Character.isLetter(c)){sb.append(stack.pop());}else{sb.append(c);}}return new String(sb);}
}

4.反转字符串中的单词

思路:整体反转+局部反转 = 区间反转

class Solution {public String reverseWords(String s) {StringBuilder sb = trimSpaces(s);int len = sb.length();reverse(sb,0,len - 1);int i = 0;for(int j = 0;j<=len;j++){if(j == len||sb.charAt(j) == ' '){reverse(sb,i,j-1);i = j+1;}}return sb.toString();}public StringBuilder trimSpaces(String s) {int left = 0, right = s.length() - 1;// 去掉字符串开头的空白字符while (left <= right && s.charAt(left) == ' ') {++left;}// 去掉字符串末尾的空白字符while (left <= right && s.charAt(right) == ' ') {--right;}// 将字符串间多余的空白字符去除StringBuilder sb = new StringBuilder();while (left <= right) {char c = s.charAt(left);if (c != ' ') {sb.append(c);} else if (sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}++left;}return sb;}public void reverse(StringBuilder sb, int left, int right) {while (left < right) {char tmp = sb.charAt(left);sb.setCharAt(left++, sb.charAt(right));sb.setCharAt(right--, tmp);}}}

二、验证回文串

思路:双指针,跳过非字母数字

class Solution {public boolean isPalindrome(String s) {if(s == null || s.length() == 0){return true;}int l = 0;int r = s.length() - 1;char[] str = s.toCharArray();while(l<r){while(l<r&&!Character.isLetterOrDigit(str[l])){l++;}while(l<r&&!Character.isLetterOrDigit(str[r])){r--;}if(Character.toLowerCase(str[l]) != Character.toLowerCase(str[r])){return false;}l++;r--;}return true;}
}

三、字符串中的第一个唯一字符

 思路:哈希表来映射索引,当出现次数超过1就赋值-1标记,最后遍历一遍哈希表返回最小值

class Solution {public int firstUniqChar(String s) {HashMap<Character,Integer> map = new HashMap<>();int min = Integer.MAX_VALUE;int len = s.length();for(int i = 0;i<len;i++){char c = s.charAt(i);if(map.containsKey(c)){map.put(c,-1);}else{map.put(c,i);}   }for(Object o : map.values()){Integer v = (Integer) o;if(v != -1 && v<min){min = v;}}return min == Integer.MAX_VALUE ? -1 : min;}
}

四、有效的字母异位词

思路:

方法一、排序,之后比较是否相等

class Solution {public boolean isAnagram(String s, String t) {if (s.length() != t.length()) {return false;}char[] str1 = s.toCharArray();char[] str2 = t.toCharArray();Arrays.sort(str1);Arrays.sort(str2);return Arrays.equals(str1, str2);}
}

方法二、哈希表存储,比较出现次数是否相同

数组实现

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

集合实现,更有通用性,不是字母也可以比较

class Solution {public boolean isAnagram(String s, String t) {Map<Character,Integer> maps = new HashMap<>();Map<Character,Integer> mapt = new HashMap<>();for(Character c : s.toCharArray()){maps.put(c,maps.getOrDefault(c,0)+1);}for(Character c : t.toCharArray()){mapt.put(c,mapt.getOrDefault(c,0)+1);}for(Object key  : maps.keySet()){if(!mapt.containsKey(key) || !maps.get(key).equals(mapt.get(key))){return false;}mapt.remove(key);}return mapt.isEmpty() ? true : false;}
}

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

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

相关文章

第14章_瑞萨MCU零基础入门系列教程之QSPI

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求

删除字符串中的子串或者字符以满足题意要求 1234. 替换子串得到平衡字符串680. 验证回文串917. 仅仅反转字母 1234. 替换子串得到平衡字符串 题目链接&#xff1a;1234. 替换子串得到平衡字符串 题目内容&#xff1a; 题目中给出了平衡字符串的定义——只有’Q’&#xff0c;…

彻底掌握Protobuf编码原理与实战

目录 1.类型2.VARINT 2.1 无符号数2.2 有符号数3.定长 3.1 I64类型3.2 I32类型4.LEN5.代码 学习这些有什么用&#xff1f; - 如果你是后端开发者&#xff0c;掌握这个对工作非常有用 - 如果你是求职者&#xff0c;面试时可以临危不惧 1.类型 最近看到有直接操作wire type相关的…

React+antd实现可编辑单元格,非官网写法,不使用可编辑行和form验证

antd3以上的写法乍一看还挺复杂&#xff0c;自己写了个精简版 没用EditableRowCell的结构&#xff0c;也不使用Context、高阶组件等&#xff0c;不使用form验证 最终效果&#xff1a; class EditableCell extends React.Component {state {editing: false};toggleEdit () &…

系统软件启动过程

实验一&#xff1a;系统软件启动过程 参考 重要文件 调用顺序 1. boot/bootasm.S | bootasm.asm&#xff08;修改了名字&#xff0c;以便于彩色显示&#xff09;a. 开启A20 16位地址线 实现 20位地址访问 芯片版本兼容通过写 键盘控制器8042 的 64h端口 与 60h端口。b.…

Selenium自动化测试框架常见异常分析及解决方法

01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium, 解决方法: 在pycharm中通过设置或terminal面板重新安装selenium 原因2: 当前项目下有selenium.py,和系统包名冲突导致, …

Amazon Aurora MySQL 和 Amazon RDS for MySQL 集群故障转移和只读实例扩容时间测试

01 测试背景 Amazon Aurora MySQL 是与 MySQL 兼容的关系数据库&#xff0c;专为云而打造&#xff0c;性能和可用性与商用数据库相当&#xff0c;成本只有其 1/10。 Amazon RDS for MySQL 让您能够在云中更轻松设置、操作和扩展 MySQL 部署。借助 Amazon RDS&#xff0c;您可以…

SpringBoot环境MongoDB分页+去重+获取去重后的原始数据

最近有个比较复杂的MongoDB查询需求&#xff0c; 要求1&#xff1a;获取最近订单表中的请求参数信息&#xff0c;并需要按照请求参数中的账号进行去重 要求2&#xff1a;数据量可能比较大&#xff0c;因此需要做分页查询 研究了大半天&#xff0c;终于搞出了解决方案&#xff0…

MySQL触发器详解保证入土

文章目录 简介一、MySQL触发器基础触发器分类基础常用关键字1. 定义触发器2. 创建和删除触发器3. 执行时机和条件 二、MySQL触发器的使用场景1. 数据完整性约束插入触发器更新触发器删除触发器 2. 数据变更日志的记录与追踪3. 触发器与存储过程的对比与选择 三、触发器的性能和…

C++学习笔记(重载、类)

C 1、函数重载2、类2.1、类的方法和属性2.2、类的方法的定义2.3、构造器和析构器2.4、基类与子类2.5、类的public、protected、private继承2.6、类的方法的重载2.7、子类方法的覆盖2.8、继承中的构造函数和析构函数 1、函数重载 函数重载大概可以理解为&#xff0c;定义两个名…

C语言实现三字棋

实现以下&#xff1a; 1游戏不退出&#xff0c;继续玩下一把&#xff08;循环&#xff09; 2应用多文件的形式完成 test.c. --测试游戏 game.c -游戏函数的实现 game.h -游戏函数的声明 (2)游戏再走的过程中要进行数据的存储&#xff0c;可以使用3*3的二维数组 char bor…

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有两个或多个不同远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔&#xff1a; 应用开源架构进行项目开发&#xff0…

Java版企业电子招标采购系统源码—企业战略布局下的采购寻源

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

Qt串口基本设置与协议收发

前言 1.一直都想要做一个Qt上位机&#xff0c;趁着这个周末有时间&#xff0c;动手写一下 2.comboBox没有点击的信号&#xff0c;所以做了一个触发的功能 3.Qt的数据类型很奇怪&#xff0c;转来转去的我也搞得很迷糊 4.给自己挖个坑&#xff0c;下一期做一个查看波形的上位…

Android 9.0 网络之netd详解

一、DHCP流程 分析netd之前先了解一下网络自动获取IP流程&#xff0c;借鉴下图流程查看代码&#xff1a; &#xff08;1&#xff09;WIFI扫描到可用网络后进行连接&#xff0c;代码路径&#xff1a;\frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiStateMa…

OJ练习第167题——单词接龙

单词接龙 力扣链接&#xff1a;127. 单词接龙 题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&…

Vue2+Vue3笔记(尚硅谷张天禹老师)day03

声明:只是记录&#xff0c;初心是为了让页面更好看,会有错误,我并不是一个会记录的人&#xff0c;所以有点杂乱无章的感觉&#xff0c;我先花点时间把视频迅速过掉&#xff0c;再来整理这些杂乱无章的内容 计划是一天更新一点 待做的东西 完成博客记录把完成后的博客记录拆成单…

计算机网络的故事——简单的HTTP协议

简单的HTTP协议 文章目录 简单的HTTP协议一、简单的HTTP协议 一、简单的HTTP协议 HTTP是不保存状态的协议&#xff0c;为了实现保存状态功能于是引入了Cookie技术。 method: get:获取资源 post:传输实体主体 put:传输文件 head:获取报文首部&#xff0c;用于确认URI的有效性以…

把文件上传到Gitee的详细步骤

目录 第一步&#xff1a;创建一个空仓库 第二步&#xff1a;找到你想上传的文件所在的地址&#xff0c;打开命令窗口&#xff0c;git init 第三步&#xff1a;git add 想上传的文件 &#xff0c;git commit -m "给这次提交取个名字" 第四步&#xff1a;和咱们在第…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…