LeetCode·每日一题·1177. 构建回文串检测·前缀和

2023-11-14

作者:小迅
链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

 

思路

题意 -> 给定一个字符串,选择其中任意位置 L-R,可以重排任意字符和替换任意 K 个字符,使得 L-R 子串为 回文串,能满足要求则为 TRUE,不能则为 FALSE。

要求转换为 回文串,什么是回文串呢?形如 abccba 则为回文串,其中存在一个特点为 相同字符为偶数 或者 在前者基础上只有一个字符出现次数为奇数。

那么现在就简单了,题意只关心能否到达要求,不关心其具体字符。那么就可以将给定字符串转换为 字符出现次数串,判断一个子串能否转换为回文串 -> 判断将当前位置中字符出现次数是否满足上述要求

那么如何转换到上述题意要求呢? 给定一个子串:

  • 相同字符出现的次数如果为偶数的话,那么这个字符就不需要使用 修改次数
  • 相同字符出现的次数如果为奇数的话:
    • 只有一个字符出现奇数次数, 不需要使用 修改次数
    • 多个字符出现奇数次数的话, 需要使用 出现次数 / 2 次 修改次数,将多余的字符转换为 偶数次出现

如何统计每一个位置字符的出现次数呢?

  • 使用数组记录每一个子串的字符出现次数
  • 因为字符只有26个,那么可以使用一个int型位记录出现次数 0 表示偶数次,1表示奇数次
  • 可以使用前缀和,任意位置可以通过左右两个子串状态相差得出当前状态

代码注释超级详细

代码


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

bool* canMakePaliQueries(char * s, int** queries, int queriesSize, int* queriesColSize, int* returnSize) {
    int n = strlen(s);
    int* count = (int*)malloc((n + 1) * sizeof(int));//二进制代替数组
    memset(count, 0, (n + 1) * sizeof(int));//初始化
    for (int i = 0; i < n; i++) {//前缀和枚举
        // ^ 为不带进位的加法
        count[i + 1] = count[i] ^ (1 << (s[i] - 'a'));//记录整体状态
    }
    bool* res = (bool*)malloc(queriesSize * sizeof(bool));//返回值数组
    for (int i = 0; i < queriesSize; i++) {//枚举子串
        int l = queries[i][0], r = queries[i][1], k = queries[i][2];
        //根据上述表示,大于13则可以能满足转换要求
        //if (k >= 13) {res[i] = true; continue;}
        // 由于没有负值, 那么 0 - 1 等价于 0 + 1
        int bits = 0, x = count[r + 1] ^ count[l];//相差得出当前状态
        while (x > 0) {//求当奇数出现次数
            x &= x - 1;
            bits++;
        }
        res[i] = bits / 2 <= k;//保存有效值
    }
    *returnSize = queriesSize;
    free(count);
    return res;
}



作者:小迅
链接:https://leetcode.cn/problems/can-make-palindrome-from-substring/solutions/2309940/qian-zhui-he-zhu-shi-chao-ji-xiang-xi-by-n3ps/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode·每日一题·1177. 构建回文串检测·前缀和 的相关文章

  • vscode卡顿优化设置

    点击左上角 文件 首选项 设置 1 向Microsoft发送使用情况 搜索关键词 telemetry 2 搜索索引 搜索关键词 search exclude 搜索是VSCode最耗费内存的活动之一 它必须保留所有文件及其内容的索引 您可能不
  • 渗透信息收集步骤(简约版)

    第一步 域名的信息收集 1 whois信息查询 备案信息查询 相关查询地址 天眼查 https www tianyancha com ICP备案查询网 http www beianbeian com 国家企业信用信息公示系统 http ww
  • 互联网情报屋

    社交领域 微信 手机 QQ 新浪微博 陌陌等 在线游戏 腾讯 奇虎 360 昆仑 在线视频 优酷 土豆 爱奇艺 PPS 乐视 迅雷看看 在线娱乐 YY 9158 招聘 51job 智联招聘 下载工具 迅雷 QQ旋风 网盘 金山快盘 360云

随机推荐

  • THE MNIST DATABASE of handwritten digits

    The MNIST database of handwritten digits available from this page has a training set of 60 000 examples and a test set o
  • FL Studio 20汉化补丁及详细激活使用说明/fl studio21怎么设置中文?

    音乐在人们心中的地位日益增高 近几年音乐选秀的节目更是层出不穷 喜爱音乐 创作音乐的朋友们也是越来越多 音乐的类型有很多 好比古典 流行 摇滚等等 对新手友好程度基本上在首位 电音类制作支持仅次于Ableton Push 调用音色和素材很方
  • 第五站:入门级小白易上手JavaScript

    第五站 入门级小白易上手JavaScript 文章目录 第五站 入门级小白易上手JavaScript 复习Web标准 三位好基友 什么是JavaScript 让我们开启JavaScript的奇妙冒险 引入JavaScript 让魔法生效 内
  • 如何下载安装jdk

    1 下载jdk 在oracle官网中下载jdk https www oracle com https www oracle com 按照如下流程依次点击 下载自己喜欢的版本即可 2 安装jdk 3 配置环境变量 新建 gt 变量名 JAVA
  • Web存储

    目录 什么是 HTML5 Web 存储 方法 cookie webStorage 会话存储 sessionStorage 本地存储localStorage 什么是 HTML5 Web 存储 使用HTML5可以在本地存储用户的浏览数据 早些时
  • Node.js连接MySQL连接池解决自动断开问题

    1 为什么要使用连接池 自己将node 写的api接口 部署服务器时 发现运行一段时间后 会查询不到数据库里的内容 通过自己百度发现到了自己没有关闭数据库 默认数据库可以保持连接一段时间 之后 就会断开连接 2 连接池如何使用 const
  • UA分享

    之前自架短地址服务搜集到的UA 感觉很乱没法分析 看看大佬们有没有兴趣 Mozilla 5 0 Linux U Android 4 4 2 zh cn GT I9500 Build KOT49H AppleWebKit 537 36 KHT
  • Opencl入门Demo

    最近负责的几个项目需要使用opencl进行编程 进行了学习 并将学习后编写的主要Demo代码记录下来 供大家初步入门使用 opencl的介绍 原理等这里就不说了 百度一下有很多 直接切入主题 这个demo实现两个数组的相加操作 1 进行平台
  • 初探BlockChain——哈希和电子签名

    昨天在B站学习到北京大学肖臻老师的 区块链技术与应用 的公开课 感到豁然开朗 BlockChain涉及到密码学的两个方面 哈希和电子签名 1 哈希 有计算机基础的童鞋都比较清楚其机制 这里再简单说一下其基本原理 哈希的意思就是引入随机数量的
  • 一对一和一对多的关联查询(该实体类中存在实体类属性和实体类集合属性,将关联的实体类详细信息查询出来,但没有查询所有该实体类信息)

    一 高级查询 高级查询主要是一对一查询 一对多查询 多对多查询 1 一对一查询 有用户和订单两个表 用户对订单是1对1查询 也就是订单中有一个外键是指向用户的 先创建实体类 User java public class User priva
  • c语言文件的方式写通讯录,用c语言多文件编写1000人的通讯录

    实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人的信息包括 姓名 性别 年龄 电话 住址 提供方法 1 添加联系人信息 2 删除指定联系人信息 3 查找指定联系人信息 4 修改指定联系人信息 5 显示所有联系人信息 6 清空所有
  • Redis —— 设置密码

    文章目录 Redis 设置密码 简介 需要修改两处 1 命令行进入Redis进行密码修改 2 修改Redis配置 redis conf 修改后重启redis Redis 设置密码 简介 没有密码 设置密码 需要修改两处 1 命令行进入Red
  • linux添加硬盘扫描

    查看host个数 ls sys class scsi host 重新扫描 echo gt sys class scsi host host编号 scan 可以形成脚本 也可以设置别名 简化操作
  • cmake获取当前编译器的类型与版本

    在使用cmake编译程序的时候 如何获取当前使用的编译器的类型 例如是clang 还是gcc cmake提供了很多相关的编译参数 可以查看当前使用的编译器的类型 当前使用的c 编译器 message CMAKE CXX COMPILER C
  • LLVM源码调试

    一 编译LLVM debug版本 调试LLVM代码需要基于debug版本 编译LLVM时 将build type设为Debug即可 cmake DCMAKE BUILD TYPE Debug 二 GDB调试 调试OPT reference
  • Linux下磁盘分区与扩容

    虚拟机增加磁盘进行磁盘分区 查看磁盘情况 root localhost df 查看设备 root localhost ls dev sd 增加磁盘 root localhost ls dev sd 找到对应增加的设备 假设增加的sdb ro
  • 【2】Qt的MainWindow的能看不能吃的框架 以及 添加图片资源

    就是加上菜单栏 窗口 这些东西 而且没做回调函数 没有做button 所以h文件没有改动 mainwindow cpp include mainwindow h include
  • selenium爬取药监总局

    url http 125 35 6 84 81 xk from selenium import webdriver from lxml import etree from time import sleep page text list d
  • python 复杂表达式

    复杂表达式 使用for循环的迭代不仅可以迭代普通的list 还可以迭代dict 假设有如下的dict d Adam 95 Lisa 85 Bart 59 完全可以通过一个复杂的列表生成式把它变成一个 HTML 表格 tds tr td s
  • LeetCode·每日一题·1177. 构建回文串检测·前缀和

    作者 小迅 链接 https leetcode cn problems can make palindrome from substring solutions 2309940 qian zhui he zhu shi chao ji xi