给你一个字符串 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)相关推荐

  1. LeetCode 5485. 找出最长的超赞子字符串 (状态压缩、二进制、位运算、前缀和)

    5485. 找出最长的超赞子字符串 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次 ...

  2. 1542. 找出最长的超赞子字符串 哈希+状态压缩

    1542. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...

  3. leetcode 5485. 找出最长的超赞子字符串

    5485. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...

  4. leetcode5485. 找出最长的超赞子字符串

    给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 1.该字符串是 s 的一个非空子字符串 2.进行任意次数的字符交换重新排序后,该字符串可以 ...

  5. Leetcode5485. 找出最长的超赞子字符串【第 32 场双周赛】

    题目链接 题意:给你一个字符串 SSS.请返回 SSS 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 SSS 的一个非空子字符串 进行任意次数的字符交换重新排 ...

  6. leetcode1542. 找出最长的超赞子字符串

    https://leetcode-cn.com/problems/find-longest-awesome-substring/ 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长 ...

  7. LeetCode 1542. 找出最长的超赞子字符串***

    具体思想: 牛皮的状态压缩+前缀,这两个都没想到: 自己当时想用滑动窗口做,但是发现有个问题:收缩的时候无法进行判断: 例如:213213: 从21开始收缩无法判断,因为后续的和前面的相加可能是个满足 ...

  8. java文件出现字符串_找出三个文本文件中都出现的字符串,并输出到一个文本文件(菜鸟求救)...

    编写java程序 找出三个文本文件中都出现的字符串,并输出到一个文本文件 下面是三个文本文件,找出其中相同的字符串(用数组的方法) 第一个文件: EEF1A1 GAPDH LOC643334 SLC3 ...

  9. java小编程----给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

    package com.henu;import java.util.Arrays;/*** @author limengdong* @date 2019年7月19日* @classroom 208bi ...

最新文章

  1. DIV布局之position详解
  2. 岭回归和lasso回归_正则化(2):与岭回归相似的 Lasso 回归
  3. c语言用double最大,C语言里double类型的最大值和最小值是多少?
  4. java 的SYSTEM类
  5. Transitions Among the Processor’s Operating Modes
  6. java 页面 传送参数,Struts2的action接收JSP页面传输的参数
  7. 使用httpclient发送get请求
  8. Linux之LIBRARY_PATH与LD_LIBRARY_PATH配置多个目录用法
  9. 拉取 google.golang.org/grpc 报错
  10. Git(8):在GitHub上,如何使fork到的项目与原仓库的更新保持同步?
  11. ERP(企业资源计划)
  12. navicat 简体中文破解版
  13. Charles抓包与改写
  14. 三子棋游戏(支持多子棋)
  15. MAD 最新技能图谱送给大家,收藏再学~
  16. 移动互联网时代,浅谈旅行社的转型升级
  17. C语言面试考点之一(常见关键字)
  18. angr原理与实践(二)—— 各类图的生成(CFG CG ACFG DDG等)
  19. CVE-2020-1938 Tomcat AJP漏洞复现
  20. 如何利用qq群来推广网站 经验分享

热门文章

  1. 基于JAVA新闻信息管理系统设计与实现 开题报告
  2. 蜗牛学院 第二天 js循环和练习题
  3. 支付宝担保交易收款接口使用
  4. oracle中分页怎么写,分页查询到底怎么写比较好
  5. pytorch中的kl散度,为什么kl散度是负数?
  6. 达梦数据库(DM8) windows安装教程
  7. Java经典编程300例 word 免费下载
  8. 如何拍背景虚化的照片_如何用单反拍出背景虚化的照片???
  9. mac连接有线宽带的心路历程
  10. Vue检测报错Identifier is not a camel case (camelcas.