2021/01/31 每日一题 相似字符串组

LeetCode上相似字符串组,今天是困难难度,但是做了一个月的并查集居然还觉得很好做,记录下解题思路

本月的最后一题当然用并查集来收尾

根据题意两个字符串相等应该是:

  1. 本身两个字符串就是相同的
  2. 字符串如果长度为2,那么怎么交换都是相等的
  3. 字符串长度不等于的情况,是可以交换2个字符,如果这两个字符交换后不相等,那么这个字符串就是不相等的。

对于1、2两点很好处理,第3点的情况就是需要循环整个字符串,可以统计对应位置字符对应的情况,对应位置的字符不相等的情况就记录一次,当记录次数大于2的时候,那么就有3个字符在对应的位置不相等了,那么根据题意只交换2个字符的条件就不满足,那么这两个字符串就是不相等的
可以写出下面的判断函数

const _iseq = function (str1,str2) {
  if(str1 === str2) return true
  if(str1.length === 2 && str2.length === 2 ) return true
  // 因为所有字符串长度相等,只需要保存一个长度即可
  let strlen = str1.length
  // 设置一个计数器,当对应位置的字符不相等的情况出现2次以上的情况,那么就是字符串不相等
  let dif = 0
  // 当两个字符串不相等,且长度不为2的情况
  for(let i=0; i

之后只需要把每个字符串看作是节点,如果两个字符串通过上面判断函数的判断,那么两个节点就相连,最后有几个节点的parent的属性是自己,这个数据就是结果

// 定义一个节点
class node {
   constructor (i) {
     // 将自己的父亲设为自己 
     this.parent = this
     // val属性记录下当前节点在accounts中的位置
     this.val = i
   }
}
// 定义查找函数,不断查找父节点,直到父节点等于本身
const find = function (x) {
   while(x !== x.parent) {
      x = x.parent
   }
   return x 
} 
// 定义函数用于判断两个字符串是否相等
const _iseq = function (str1,str2) {
  if(str1 === str2) return true
  if(str1.length === 2 && str2.length === 2 ) return true
  // 因为所有字符串长度相等,只需要保存一个长度即可
  let strlen = str1.length
  // 设置一个计数器,当对应位置的字符不相等的情况出现2次以上的情况,那么就是字符串不相等
  let dif = 0
  // 当两个字符串不相等,且长度不为2的情况
  for(let i=0; i new node(i))
  console.log(nodes)
  // 用于连通nodes的map
  let nodesmap = []
  // 最后返回的结果
  let res = 0
  // 第一次遍历字符串数组,得到连通的数据
  for(let i = 0; i

你可能感兴趣的:(2021/01/31 每日一题 相似字符串组)