【Leetcode刷题篇】有关字符串的回文、全排列、子序列的有关题目
发布日期:2021-06-29 15:34:29 浏览次数:2 分类:技术文章

本文共 2981 字,大约阅读时间需要 9 分钟。

1.打印字符串的全部子序列

01 首先给定一个字符串,如何打印其全部的子序列

对其遍历,当前字符串一共两个选择,添加进去或者不添加进去。

// 找其全部子序列	public static void printAllSequences(String s) {
char[] chs = s.toCharArray(); String res = ""; process(chs,0,res); } public static void process(char[] chs,int i,String res) {
if(i==chs.length) {
System.out.println(res); return; } process(chs, i+1, res+chs[i]); process(chs, i+1, res); }

结果为:

abc
ab
ac
a
bc
b

02 字符串的全排列问题

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
相比较上述的子序列而言,需要都遍历完所有的字符串

// 找其全排列	public static List
res_all = new ArrayList<>(); public static String[] permutation(String s) {
char[] chs = s.toCharArray(); String res = ""; int i = 0; process_2(chs,i,res); return res_all.toArray(new String[res_all.size()]); } public static void process_2(char[] chs,int i,String res) {
// 截止条件 if(i==chs.length) {
res_all.add(res); return; } // 避免重复 HashSet
hashset = new HashSet
(); // 全排列 for(int j=i;j

03 回文子串问题

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:“abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:“aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

解题思路来自中心点:

比如对一个字符串 ababa,选择最中间的 a 作为中心点,往两边扩散,第一次扩散发现 left 指向的是 b,right 指向的也是 b,所以是回文串,继续扩散,同理 ababa 也是回文串。

这个是确定了一个中心点后的寻找的路径,然后我们只要寻找到所有的中心点,问题就解决了。

中心点一共有多少个呢?看起来像是和字符串长度相等,但你会发现,如果是这样,上面的例子永远也搜不到 abab,想象一下单个字符的哪个中心点扩展可以得到这个子串?似乎不可能。所以中心点不能只有单个字符构成,还要包括两个字符,比如上面这个子串 abab,就可以有中心点 ba 扩展一次得到,所以最终的中心点由 2 * len - 1 个,分别是 len 个单字符和 len - 1 个双字符。

如果上面看不太懂的话,还可以看看下面几个问题:

  • 为什么有 2 * len - 1 个中心点?
    aba 有5个中心点,分别是 a、b、c、ab、ba
    abba 有7个中心点,分别是 a、b、b、a、ab、bb、ba
  • 什么是中心点?
    中心点即 left 指针和 right 指针初始化指向的地方,可能是一个也可能是两个
  • 为什么不可能是三个或者更多?
    因为 3 个可以由 1 个扩展一次得到,4 个可以由两个扩展一次得到
    Java
// 中心点扩展		int res = 0;		// 中心点遍历		for(int counter=0;counter<2*s.length()-1;counter++) {
int left = counter/2; int right = left + counter%2; // 判断是否为回文串 while(left>=0&&right

04 最长回文子串问题

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

相比较上述,判断长度即可了。

class Solution {
public String longestPalindrome(String s) {
// 中心扩展 String res = ""; for(int counter=0;counter<2*s.length()-1;counter++) {
int left = counter / 2; int right = left + counter % 2; // 开始扩散 while(left>=0&&right
res.length()) {
res = temp; } left--; right++; } } return res; }}

05 最长回文子串

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

注意:

假设字符串的长度不会超过 1010。

示例 1:

输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

该题不同于上面一题主要是该题是可以对字符串自由组合来得到最长,不是连续的,那么如何解题呢?

解题思路来自于对该字符串进行遍历,找到其字母的出现频率,其构成回文字符串的话是该频率为奇数个数有关的,若全为偶则整个长度,若有奇数则长度-奇数+1即可。

class Solution {
public int longestPalindrome(String s) {
int[] arr = new int[128]; for(char c:s.toCharArray()){
arr[c]++; } int count = 0; for(int i:arr){
count += (i%2); } return count==0?s.length():(s.length()-count+1); }}

转载地址:https://codingchaozhang.blog.csdn.net/article/details/110673872 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Leetcode刷题篇】leetcode647 回文子串
下一篇:【多线程与高并发】如何用线程池创建线程?Java线程池创建线程详解

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月11日 10时02分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【Python爬虫实战】知乎热榜数据采集,上班工作摸鱼两不误,知乎热门信息一网打尽 2021-07-02
自从我学会了数据挖掘Matplotlib、Numpy、Pandas、Ta-Lib等一系列库,我把领导开除了 2021-07-02
Python抓取哔哩哔哩up主信息:只要爬虫学的好,牢饭吃的早 2021-07-02
有个码龄5年的程序员跟我说:“他连wifi从来不用密码” 2021-07-02
领导让我整理上个季度的销售额,幸好我会Python数据分析,你猜我几点下班 2021-07-02
【Python爬虫实战】为何如此痴迷Python?还不是因为爱看小姐姐图 2021-07-02
零基础自学Python,你也可以实现经济独立! 2021-07-02
ElasticSearch与Mysql对比(ElasticSearch常用方法大全,持续更新) 2021-07-02
数字化转型的主干道上,华为云以“三大关键”成企业智能化推手 2021-07-02
数字化为何不走“捷”“径”? 2021-07-02
和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了 2021-07-02
BCOP章鱼船长,6月22日晚上8点上线薄饼 2021-07-02
为战疫助力,半导体功不可没 2021-07-02
了解这些操作,Python中99%的文件操作都将变得游刃有余! 2021-07-02
知道如何操作还不够!深入了解4大热门机器学习算法 2021-07-02
只有经历过,才能深刻理解的9个编程道理 2021-07-02
发现超能力:这些数据科学技能助你更高效专业 2021-07-02
AI当道,人工智能将如何改变金融业? 2021-07-02
消除性别成见,技术领域需要更多“乘风破浪的姐姐” 2021-07-02
7行代码击败整个金融业,这对20多岁的爱尔兰兄弟是如何做到的? 2021-07-02