JAVA程序设计:找出最长的超赞子字符串(LeetCode:5485)
给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。
「超赞子字符串」需满足满足下述两个条件:
该字符串是 s 的一个非空子字符串
进行任意次数的字符交换后,该字符串可以变成一个回文字符串
示例 1:
输入:s = "3242415"
输出:5
解释:"24241" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "24142"
示例 2:
输入:s = "12345678"
输出:1
示例 3:
输入:s = "213123"
输出:6
解释:"213123" 是最长的超赞子字符串,交换其中的字符后,可以得到回文 "231132"
示例 4:
输入:s = "00"
输出:2
提示:
1 <= s.length <= 10^5
s 仅由数字组成
思路:本文考虑通过前缀和+状态压缩的方式解决此题,由于数字只有十种情况,并且我们只关注每种数字出现次数的奇偶性,因此我们可以考虑采用10位二进制来表示每一种数字[0--9]出现次数是奇数还是偶数,例如:0000000101表示数字0和数字2出现了奇数次,其余数字出现了偶数次,之后我们统计前缀和来记录每种状态最早出现的位置。我们知道在一个区间内的字符能组成回文串的条件是:当且仅当最多有一个数字出现了奇数次,其余数字出现了偶数次。通过这一条件,我们可以利用上述二进制状态来求解。详见代码:
class Solution {public int longestAwesome(String s) {int ans = 1, now = 0;int len = s.length();Map<Integer, Integer> map = new HashMap<>();map.put(now, -1);for (int i = 0; i < len; i++) {int num = s.charAt(i) - '0';now = now ^ (1 << num);for (int j = 0; j < 10; j++) {int nxt = now ^ (1 << j);if (map.containsKey(nxt))ans = Math.max(ans, i - map.get(nxt));}if (!map.containsKey(now))map.put(now, i);elseans = Math.max(ans, i - map.get(now));}return ans;}
}
JAVA程序设计:找出最长的超赞子字符串(LeetCode:5485)相关推荐
- LeetCode 5485. 找出最长的超赞子字符串 (状态压缩、二进制、位运算、前缀和)
5485. 找出最长的超赞子字符串 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次 ...
- 1542. 找出最长的超赞子字符串 哈希+状态压缩
1542. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...
- leetcode 5485. 找出最长的超赞子字符串
5485. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...
- leetcode5485. 找出最长的超赞子字符串
给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 1.该字符串是 s 的一个非空子字符串 2.进行任意次数的字符交换重新排序后,该字符串可以 ...
- Leetcode5485. 找出最长的超赞子字符串【第 32 场双周赛】
题目链接 题意:给你一个字符串 SSS.请返回 SSS 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 SSS 的一个非空子字符串 进行任意次数的字符交换重新排 ...
- leetcode1542. 找出最长的超赞子字符串
https://leetcode-cn.com/problems/find-longest-awesome-substring/ 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长 ...
- LeetCode 1542. 找出最长的超赞子字符串***
具体思想: 牛皮的状态压缩+前缀,这两个都没想到: 自己当时想用滑动窗口做,但是发现有个问题:收缩的时候无法进行判断: 例如:213213: 从21开始收缩无法判断,因为后续的和前面的相加可能是个满足 ...
- java文件出现字符串_找出三个文本文件中都出现的字符串,并输出到一个文本文件(菜鸟求救)...
编写java程序 找出三个文本文件中都出现的字符串,并输出到一个文本文件 下面是三个文本文件,找出其中相同的字符串(用数组的方法) 第一个文件: EEF1A1 GAPDH LOC643334 SLC3 ...
- java小编程----给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
package com.henu;import java.util.Arrays;/*** @author limengdong* @date 2019年7月19日* @classroom 208bi ...
最新文章
- DIV布局之position详解
- 岭回归和lasso回归_正则化(2):与岭回归相似的 Lasso 回归
- c语言用double最大,C语言里double类型的最大值和最小值是多少?
- java 的SYSTEM类
- Transitions Among the Processor’s Operating Modes
- java 页面 传送参数,Struts2的action接收JSP页面传输的参数
- 使用httpclient发送get请求
- Linux之LIBRARY_PATH与LD_LIBRARY_PATH配置多个目录用法
- 拉取 google.golang.org/grpc 报错
- Git(8):在GitHub上,如何使fork到的项目与原仓库的更新保持同步?
- ERP(企业资源计划)
- navicat 简体中文破解版
- Charles抓包与改写
- 三子棋游戏(支持多子棋)
- MAD 最新技能图谱送给大家,收藏再学~
- 移动互联网时代,浅谈旅行社的转型升级
- C语言面试考点之一(常见关键字)
- angr原理与实践(二)—— 各类图的生成(CFG CG ACFG DDG等)
- CVE-2020-1938 Tomcat AJP漏洞复现
- 如何利用qq群来推广网站 经验分享