https://leetcode-cn.com/problems/find-longest-awesome-substring/

题意:

给你一个字符串 s 。请返回 s 中最长的 超赞子字符串 的长度。

「超赞子字符串」需满足满足下述两个条件:

该字符串是 s 的一个非空子字符串
进行任意次数的字符交换后,该字符串可以变成一个回文字符串

方法:哈希表+前缀和,主要在于够建状态哈希表,和哈希表映射操作来进行状态的转换,利用异或的性质,一个数经过两次异或以后,会得到自己本身的值,但是映射操作无法获取由一个出现奇数次的数字和数个出现偶数次的数字组成的数字串,需要通过循环,进行额外的判断。

class Solution {
public:int longestAwesome(string s) {int maxL=0;vector<int> v1(1024,-2);//哈希表vector<int> v2={1,2,4,8,16,32,64,128,256,512};//存储状态映射操作关系v1[0]=-1;//初始化0状态对应的序列号为-1int cur = 0;//初始化状态为0for(int i=0;i<s.size();i++){cur^=v2[s[i]-'0'];//选择对应的状态的操作,如果是数字0,我们选择v2[0],与1异或,如果是数字1,我们选择v2[1],与2异或if(v1[cur]==-2)//如果对应的状态不存在哈希表,将状态对应的序列号写入哈希表v1[cur] = i;else//否则我们就看看最大值能不能更新maxL = maxL>(i-v1[cur])?maxL:(i-v1[cur]);for(int j=0;j<10;j++)//这一步是因为以上的操作只能过选择数字出现次数为偶数次的数字串,加上这一步就能获得出现偶数次的数字和一个出现奇数次的数字组合起来的数字串{int tmp = cur;tmp ^= v2[j];if(v1[tmp]!=-2)maxL = maxL>(i-v1[tmp])?maxL:(i-v1[tmp]);}}return maxL;}
};

优化后的代码:

class Solution {
public:int longestAwesome(string s) {int maxL=0;vector<int> v1(1024,-2);v1[0]=-1;int cur = 0;for(int i=0;i<s.size();i++){cur^=1<<(s[i]-'0');if(v1[cur]==-2)v1[cur] = i;elsemaxL = maxL>(i-v1[cur])?maxL:(i-v1[cur]);for(int j=0;j<10;j++){int tmp = cur;tmp ^= 1<<j;if(v1[tmp]!=-2)maxL = maxL>(i-v1[tmp])?maxL:(i-v1[tmp]);}}return maxL;}
};

leetcode1542. 找出最长的超赞子字符串相关推荐

  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. JAVA程序设计:找出最长的超赞子字符串(LeetCode:5485)

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

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

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

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

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

  9. 【Python】最长括号匹配问题:给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串

    最长括号匹配 示例: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长匹配的括号子串. 算法分析 只有在右括号和左括号发生匹配时,才有可能更新最终解. 计算s[0 ...

最新文章

  1. QuickPart : 用户控件包装器 for SharePoint 2007
  2. linux系统安装yum环境
  3. 二十四、深入Java抽象类,抽象方法和接口
  4. cfile 修改某些位_王者荣耀:打野刀效果再次修改,自定义房间配置试运行!
  5. 基于 OData 模型和 JSON 模型的 SAP UI5 表格控件行项目的添加和删除实现
  6. System V 信号量
  7. Maven命令 install 和 package的区别
  8. 关于JVM默认内存的增加
  9. Appium UiWatchers 监听解决各种非期待弹窗,弹层,弹弹弹等问题
  10. dreamweaver php代码提示框,PHP 5.4中的Dreamweaver CS5代码提示和语法错误
  11. SqlServer触发器常用语法AFTER、INSTEAD OF及其详解
  12. C#的目录与文件操作
  13. 2012年全国医院排名(转)
  14. 指纹识别登录Windows Server服务器远程桌面
  15. 【腾讯QQ官方正式版下载】基于Internet的即时通信(IM)软件
  16. 不等式大两边小中间_不等式取值范围口诀
  17. Oracle number 类型转换为 varchar2
  18. R16 NR CDRX
  19. 如何使用python寻找K线中的黄昏之星
  20. Codeforces1442 D. Sum(dp+分治优化)

热门文章

  1. 2018/7/16 初学者
  2. 成为安全架构师需要了解什么
  3. CSDN-markdown写博客使用LaTeX语法编写数学公式(再也不怕手写公式,以后博客手写复杂公式就靠它了!)
  4. 5G的朋友圈如何改变未来生活丨边缘计算阅读周
  5. linux内核调试指南 1
  6. 声发射传感器的简易校准方法
  7. 蒙泰转债上市价格预测
  8. 智慧路灯| 云计算点亮智慧城市的“星星之火”
  9. Facebook进一步侵犯了FriendFeed的地盘
  10. PHP 名字替换* 手机号码替换*