给定一系列字符串集合,合并有交集的集合,合并完后集合之间无交集
2013-10-04 23:00
162 查看
#pragma warning(disable:4786) #include <iostream> #include <map> #include <set> #include <vector> using namespace std; int main() { //初始化数据 vector<vector<char*> > v; vector<char*> v1; v1.push_back("aaa"); v1.push_back("bbb"); v1.push_back("ccc"); v.push_back(v1); v1.clear(); v1.push_back("bbb"); v1.push_back("ddd"); v.push_back(v1); v1.clear(); v1.push_back("eee"); v.push_back(v1); v1.clear(); v1.push_back("ggg"); v1.push_back("fff"); v.push_back(v1); v1.clear(); v1.push_back("ddd"); v1.push_back("hhh"); v.push_back(v1); v1.clear(); int len = v.size(); int i, j; int *a; map<char*, int*> m; vector<vector<char*> >::iterator v_iter; map<char*, int*>::iterator m_iter; //查看每个字符串在哪些集合出现过 for(v_iter=v.begin(); v_iter!=v.end(); v_iter++) { for(i=0; i<(*v_iter).size(); i++) { m_iter = m.find((*v_iter)[i]); if(m_iter == m.end()) { a = new int[len]; for(j=0; j<len; j++) a[j] = -1; a[v_iter-v.begin()] = 0; m.insert(pair<char*, int*>((*v_iter)[i], a)); } else { a = m_iter->second; a[v_iter-v.begin()] = 0; } } } int *b = new int[len]; for(i=0; i<len; i++) b[i] = i; bool b_front = false; int front; //如果出现在多个集合中,只取第一次出现的集合的id for(m_iter=m.begin(); m_iter!=m.end(); m_iter++) { b_front = false; a = m_iter->second; for(i=0; i<len; i++) { if(a[i]==0) { if(!b_front) { front = i; b_front = true; } else { b[i] = front; } } } } //记录集合合并后的归属 for(i=0; i<len; i++) if(b[i]!=i) b[i]=b[b[i]]; map<int, vector<char*> > m_union; map<int, vector<char*> >::iterator m_u_iter; //添加合并后的字符串 for(m_iter=m.begin(); m_iter!=m.end(); m_iter++) { a = m_iter->second; for(i=0; i<len; i++) if(a[i]==0) break; j = b[i]; m_u_iter = m_union.find(j); if(m_u_iter == m_union.end()) { v1.clear(); m_union.insert(pair<int, vector<char*> >(j, v1)); m_u_iter = m_union.find(j); } (m_u_iter->second).push_back(m_iter->first); } //输出合并后的集合 for(m_u_iter=m_union.begin(); m_u_iter!=m_union.end(); m_u_iter++) { copy((m_u_iter->second).begin(), (m_u_iter->second).end(), ostream_iterator<char*>(cout, " ")); cout<<endl; } delete []b; return 0; }
相关文章推荐
- 给定一个字符串的集合, 要求合并完成后的集合之间无交集。
- Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
- 陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。
- 每日一道算法题:Google 2009年某笔试题:求出元素位于0到9之间的集合A中大于某个给定正整数K的组成的最小正整数。
- java实现给定字符串之间的全排列算法
- 编程题:给定两个集合,求两个集合的交集
- 合并两个字符集合为一个新集合,每个字符串在新集合中仅出现一次,函数返回新集合中字符串。
- [删除字符串中多余的空格]给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个
- 字符串集合的合并
- Json——使用Json jar包实现Json字符串与Java对象或集合之间的互相转换
- 枚举与字符串、数字之间的转换和el表达式能与字符串比较并且还能取集合中的某个对象
- 给定一个字符串s,求子串都是回文的集合。
- 编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集合中出现的字符
- 将多个集合合并成没有交集的集合
- 给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个
- 获取两个DataTable之间的差集、交集、并集集合(Except、Intersect、Union)
- 一道算法题——合并有交集的集合
- 字符串集合求并集和交集
- SQL查询集合合并成字符串
- 一道算法题——合并有交集的集合