LeetCode --- 字符串系列 --- 特殊等价字符串组

特殊等价字符串组

注释:这道题目题意太过难理解,理解题意花了几小时... 下面将对题目进行括号注释....

题目

你将得到一个字符串数组 A。比如 (["a2cd","ac2d","2acd", "c2ad"])

如果经过任意次数的移动,S == T,那么两个字符串 S 和 T 是特殊等价的。

(比如上面给出的字符串数组,若其中两个数组元素字符串,自身的字符发生任意次数的移动,

移动次数不用相等,最后这两个字符串可以相等,那么就说这两个字符串是等价的。

在这个字符串数组中,可以存在多个等价字符串)

一次移动包括选择两个索引 i 和 j,且?i % 2 == j % 2,交换 S[j] 和 S [i]。

(这里意思是上面所说到的任意次移动,每次移动,需要移动字符串中的两位,这两位互相交换位置;

移动的这两位位置要满足条件 i % 2 == j % 2。即 i 和 j 都是偶数或者奇数。

换个说法,对字符串进行奇数位交换操作,或者偶尔位交换操作或者奇数位交换完成后,进行偶数位交换,次数不限)

拿上面的例子:

每个数组字符串元素各经过一次(实际可以交换多次)偶数位和奇数位交换:

`a2cd` 偶数变化-> adc2 -> 偶数位再变一次(变回来了) `a2cd`
       奇数变化-> `c2ad`

ac2d   偶数变化-> 2cad
       奇数变化-> ad2c

2acd   偶数变化-> ca2d
       奇数变化-> 2dca

`c2ad` 偶数变化-> `a2cd`
       奇数变化-> cda2`

观察发现 a2cdc2ad 经过上面的变化之后可以相等,那么这两个就是等价的

原字符串 经过任意次数变化可以变回自己,所以每个字符串跟自己是特殊等价

现在规定,A 中的特殊等价字符串组是 A 的非空子集 S

这样不在 S 中的任何字符串与 S 中的任何字符串都不是特殊等价的。

(这里加了一个限制条件:不在 S 中的任何字符串与 S 中的任何字符串都不是特殊等价的

应该为 不在 S 中任何的字符串(即在 A 中刨去 S 字符串之后的剩下字符串)与 S 中的任何字符串都不是特殊等价的)

(上面我说,每个字符串跟自己是特殊等价的, 单个字符串 如果没有其他字符串和他自己等价,那么他自己就组成了一个等价字符串数组,保证了 S 是 A 的非空子集。

但是也可以这么想,是不是因为有了这条规定:A 中的特殊等价字符串组是 A 的非空子集 S,才限制我们若 单个字符串 没有其他字符串和他自己等价,他自己就组成了一个等价字符串数组)

返回 A?中特殊等价字符串组的数量。

示例

示例 1:

输入:["a","b","c","a","c","c"]
输出:3
解释:3 组 ["a","a"],["b"],["c","c","c"]
示例 2:

输入:["aa","bb","ab","ba"]
输出:4
解释:4 组 ["aa"],["bb"],["ab"],["ba"]
示例 3:

输入:["abc","acb","bac","bca","cab","cba"]
输出:3
解释:3 组 ["abc","cba"],["acb","bca"],["bac","cab"]
示例 4:

输入:["abcd","cdab","adcb","cbad"]
输出:1
解释:1 组 ["abcd","cdab","adcb","cbad"]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/groups-of-special-equivalent-strings/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

1、字符串数组中的元素可以进行任意次偶数、奇数位移动,产生多个排列组合
若有另外一个字符串也经过这样的操作产生排列组合,这两个排列组合中有相等的一对,那么这两个 `原字符串` 就是特殊等价的

2、所以第一步对字符串进行排列

3、第二步找出两个排列组合中相等的一对

或者

较好力扣题解

1、
字符串切割,过滤奇数位字符串,排序拼接
加上
字符串切割,过滤偶数位字符串,排序拼接

2、若是等价字符,则经过此操作将会相等

3、最后利用 Set 的去重特性,转换成数组,可以得到最终长度

题解

let numSpecialEquivGroups = function (A) {
    let obj = {}
    // 遍历字符串数组
    for (let i = 0; i < A.length; i++) {
        // 匹配计数,偶数字符串,奇数字符串
        let count = 0, evens = ‘‘, odds = ‘‘
        A[i].replace(/\w/g, w => {
            count++
            // 匹配到字符 count 就加 1
            // 分别收集偶数位和奇数位的字符串
            if (count % 2 === 0) {
                evens += w
            } else {
                odds += w
            }
        })
        // 排序
        evens = evens.split(‘‘).sort()
        odds = odds.split(‘‘).sort()
        let key = ‘‘
        // 以奇数字符串开始,顺序插入偶数位
        odds.forEach((w, index) => {
            key += w + (evens[index] ? evens[index] : ‘‘)
        })
        // 将排列后相同的原字符串归类收集起来
        obj[key] = obj[key] || []
        obj[key].push(A[i])
    }
    // 最后返回 obj 的属性长度
    return Object.keys(obj).length
}

或者

较好力扣题解

const numSpecialEquivGroups = (A) =>
    [
    ...new Set(
        A.map(
        (item) =>
            // 字符串切割,过滤奇数位字符串,排序拼接
            // 加上
            // 字符串切割,过滤偶数位字符串,排序拼接
            // 若是等价字符,则经过此操作将会相等
            // 最后利用 Set 的去重特性,转换成数组,可以得到最终长度
            item
            .split(‘‘)
            .filter((t, i) => i % 2 === 1)
            .sort()
            .join(‘‘) +
            item
            .split(‘‘)
            .filter((t, i) => i % 2 === 0)
            .sort()
            .join(‘‘)
        )
    ),
    ].length

原文地址:https://www.cnblogs.com/linjunfu/p/12676932.html

时间: 2024-11-08 19:24:01

LeetCode --- 字符串系列 --- 特殊等价字符串组的相关文章

shell编程系列4--有类型变量:字符串、只读类型、整数、数组

shell编程系列4--有类型变量:字符串.只读类型.整数.数组 有类型变量总结: declare命令和typeset命令两者等价 declare.typeset命令都是用来定义变量类型的 declare命令参数总结 1.declare -r 将变量设置为只读类型 declare -r var="hello" var="world" # 变量默认可以修改 [[email protected] shell]# var2="hello world"

【LeetCode】- String to Integer (字符串转成整形)

[ 问题: ] Hint:Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes:It is intended for this problem to be specified vaguely (ie, no given input specs). Y

(原创)Python字符串系列(1)——str对象

在本博客 <Python字符串系列> 中,将介绍以下内容: Python内置的str对象及操作 字符串的格式化 Python中的Unicode字符串 Python中的正则表达式 re模块 本文将介绍Python内置的 str 类型,列举Python中字符串对象支持的方法,使用这些方法可以实现强大的字符串处理功能. 在Python 2 中,普通字符串与Unicode字符串有着明确的区分,二者都是Python内置的基本类型,例如: >>> type(str) <type '

字符串系列函数(不断跟新)

1.sprintf,sprintf_s sprintf(char* buffer, const char* format, [argument]); vs下需要加上_CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main() { char name[1]; int input = 9099; sprintf(name,"%d", input); system("pause&q

leetcode——String to Integer (atoi) 字符串转换为整型数(AC)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

【基础练习】【字符串处理】noip2011普及组第2题 统计单词数题解

这又是一道成功加入"容易吗"系列的基础题= =原本很简单,可是我一开始太大意看错了题,以为是让输出该单词是第几个单词,实际上应该输出该单词的首字母在第几个位置:改过后只得了二十分,看了一组数据,原来第一个单词前面可以有前导空格--幸亏其他单词前没有,否则还真不知道怎么办:实现的时候又出了各种问题.于是我决定总结一下. 题目: 给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大

LeetCode:Valid Number - 判断字符串中内容是否为数字

1.题目名称 Valid Number(判断字符串中内容是否为数字) 2.题目地址 https://leetcode.com/problems/valid-number/ 3.题目内容 英文:Validate if a given string is numeric. 中文:给出一个字符串,检查这个字符串中内容是否是一个数字 例如:"0"." 0.1"."2e10"是数字,"abc"."1 a"不是数字 4

Go 系列教程 —— 14. 字符串

欢迎阅读 Golang 系列教程第 14 部分. 由于和其他语言相比,字符串在 Go 语言中有着自己特殊的实现,因此在这里需要被特别提出来. 什么是字符串? Go 语言中的字符串是一个字节切片.把内容放在双引号""之间,我们可以创建一个字符串.让我们来看一个创建并打印字符串的简单示例. package main import ( "fmt" ) func main() { name := "Hello World" fmt.Println(nam

LeetCode OJ:Multiply Strings (字符串乘法)

Given two numbers represented as strings, return multiplication of the numbers as a string. Note: The numbers can be arbitrarily large and are non-negative. 给出两个字符串,返回对应数字想乘后的字符串,由于这个字符串可能很大,所以不能采用一般的乘法,这里用的方法是模拟手工的乘法运算,算法 本身很简单,就是当时写的时候有些很小的细节搞错了,找了