字符串集合的合并

将多个集合合并成没有交集的集合。    
给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaa bbb ccc ddd hhh},{eee fff}, {ggg}。   
(1)请描述你解决这个问题的思路;   
(2)请给出主要的处理流程,算法,以及算法的复杂度   
(3)请描述可能的改进。

采用并查集。(关于并查集,上篇博文讲了)

首先所有的字符串都在单独的并查集中。然后依扫描每个集合,顺序合并将两个相邻元素合并。例如,对于,首先查看aaa和bbb是否在同一个并查集中,如果不在,那么把它们所在的并查集合并,然后再看bbb和ccc是否在同一个并查集中,如果不在,那么也把 它们所在的并查集合并。接下来再扫描其他的集合,当所有的集合都扫描完了,并查集代表的集合便是所求。复杂度应该是O(NlgN)的。改进的话,首先可以 记录每个节点的根结点,改进查询。合并的时候,可以把大的和小的进行合,这样也减少复杂度。

#include <stdio.h>
#include <stdlib.h>

#define MAX 26

//将给定的字符串的集合转化为如下的关系“aaa”编号为1,以此类推。。。。
int relation[6][2] = {
        {1,2},//{"aaa","bbb"}
        {1,3},//{"aaa","ccc"}
        {2,4},
        {5,6},
        {4,8},
        {7,7}//{ggg}
      };
//(之所以这么复杂去实现,主要是为了输出ggg,目前使用并查集没有更好的办法)
//找主根(一开始初始化为-1,如果A[x]<0,首先
//给其根节点赋值为本身并返回,其次其根节点为本身的,返回其本身。)
//此函数主要目的是在集合合并处使用
int find_root(int A[], int x)
{
//结合调用的for循环i=0~6;故只有出现的字母才会出现自己的根节点是自己,没有出现的字母根节点仍然是-1;(为了以后再输出时方便,加以控制)
  if(A[x]<0)
      {
          A[x]=x;
        return x;
    }
  else if(A[x]==x)
          return x;
  else
    return find_root(A, A[x]);
}
//(此函数主要是在最后结果输出时使用 )
//返回根节点
int findroot(int A[],int x)
{
  if(A[x]==x||A[x]==-1)
    return A[x];
  else
    return findroot(A, A[x]);
}

int main(int argc, char *argv[])
{
  int i;
  int root1;
  int root2;
  int A[MAX];//根节点的存储
//一开始根节点的数组里面的值初始化为-1
  for(i=0;i<26;i++)
    A[i] = -1;
//遍历relation二维数组来实现集合的合并
  for(i=0;i<6;i++)
   {
    root1 = find_root(A, relation[i][0]);
    root2 = find_root(A, relation[i][1]);
    if(root1!=root2)//集合根节点的合并 (此处还可以优化?)
            A[root1]=root2;
   } 

//结果的输出
   int flag[26]={0};
   for(i=1;i<26;i++)
   {
           if(flag[i])
               continue;
           int mark=findroot(A,i);//为了输出找根节点  之前是A[i]  by felix
        //根节点为-1的不考虑
           if(mark!=-1)
           {
               flag[i]=1;
               printf("%c%c%c\t",i+‘a‘-1,i+‘a‘-1,i+‘a‘-1);
               for(int j=i+1;j<26;j++)
               {
                   if(flag[j])
                       continue;
                   int marks=findroot(A,A[j]);
                   if(marks==mark)
                   {
                       flag[j]=1;
                       printf("%c%c%c\t",j+‘a‘-1,j+‘a‘-1,j+‘a‘-1);
                }
            }
            puts("");
        }

   }
  system("PAUSE");
  return 0;
}

方法二:使用hash_table方法

http://www.cnblogs.com/ttltry-air/archive/2012/08/14/2638437.html

时间: 2024-08-11 01:22:15

字符串集合的合并的相关文章

java字符串集合

一,java的接口跟C语言所能做到的相比确实是让人眼前一亮的东西.利用接口可以将多种东西放到一起,在编程过程中就能省略掉相同类的很多重复代码,将代码进行分类别的,统一的处理. 二,java中的字符串处理,java中的字符串并不像C语言那样利用二维数组来进行操作,而是对应了String这个对象,可以用new的方法创建一个字符串对象,而这个字符串对象有很多方法可以直接调用,这样直接对对象进行操作,显得非常方便. 神奇的字符串操作方法 str.length() str.indexOf(),indexO

利用Linq对集合元素合并、去重复处理

今晚看了一篇前辈写的linq对集合元素合并去重复处理,觉得有点麻烦,原文地址如下:http://www.cnblogs.com/yjmyzz/archive/2012/12/18/2823170.html#undefined. 于是我自己琢磨利用linq的分组函数,重新写了一个方法,代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleAp

OC字符串实现路径合并

OC中使用字符串完成路径合并的操作 1 /** 2 * 路径合并案例 3 * stringByTrimmingCharactersInset: 4 */ 5 #import <Foundation/Foundation.h> 6 7 int main(int argc, const char * argv[]) { 8 @autoreleasepool { 9 10 NSString *path=@"Users/apple/Desktop";//文件路径 11 NSStri

给出一个set的字符和一个正数k,求所有由这个set能组成长度为k的字符串集合 print-all-combinations-of-given-length

// 给出一个set的字符和一个正数k,求所有由这个set能组成长度为k的字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba abb baa bab bba bbb Input: set[] = {'a', 'b', 'c', 'd'}, k = 1 Output: a b c d package recursion; import java.util.ArrayList; public class N_sets_form_

给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length

// 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba abb baa bab bba bbb Input: set[] = {'a', 'b', 'c', 'd'}, k = 1 Output: a b c d package recursion; import java.util.ArrayList; public class N_sets_form

字符串集合或字符串数组转换成json数组

字符串可以是List<String>类型的字符串集合,也可以是String[]类型的字符串数组,二者转换成JSON数组的方式没有什么不同.下面代码注意关键的部分即可(画红线部分). 1. List<String>类型的字符串集合转换成JSON数组,如下所示: List<String> shotLst = ecsDao.selectShotInstanceData4Ali(requestShotMap); JSONArray shotrray = JSONArray.fr

PHP字符串 集合的相关函数

PHP第三次字符串处理函数<?php/** * Created by PhpStorm. * User: yangguojun * Date: 16/3/16 * Time: 下午7:26 *///1.去掉空格及特殊字符 trim函数 //$str='asdf ghjkl\t'; //echo($str);//trim 去掉两端空格 //echo(trim($str));//echo('test'); //移除两端指定的字符 as 和 \t//echo(trim($str,'as\t')); /

【python cookbook】【字符串与文本】14.字符串连接及合并

问题:将许多小字符串合并成一个大的字符串 解决方案: 1.针对少数量的字符串:+ 2.针对大量的字符串对象的连接,更高效的方法:join() 3.更加复杂的字符串:format() >>> parts=['Is','Chicago','Not','Chicago?'] >>> ','.join(parts) 'Is,Chicago,Not,Chicago?' >>> a='Is Chicago' >>> b='Not Chicago?

swift_简单值 | 元祖 | 流程控制 | 字符串 | 集合

//: Playground - noun: a place where people can play import Cocoa var str = "Hello, playground" //这里先提及下, //Swift中的属性的定义 //属性名首字母只能是字母,下划线 //首字母后也只能是数字,字母,下划线 /****************************************常量与变量**/ /**************常量的定义*/ //语法上就是使用let关