字符遍历

#include <algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
std::vector<int> ans;//vector 动态数组 
//g[65][65]二维矩阵存储 类似无向图 d[65] 标记每个字符出现的次数 
int n,g[65][65],d[65];
char str[5];//输入字符

/*
	根据相对位置数字转化字符 
*/
inline char tochar(int x){
	if(x>=1&&x<=26)
		return x-1+'A';
	else
		return x-27+'a';
}

/*
	大小写字母转化对应相对位置数字 
*/
inline int getnum(char ch){
	if(ch>='A'&&ch<='Z')
		return ch-'A'+1;
	else
		return 27+ch-'a';
}

/*
	递归存入 动态数组ans中 
*/
inline void dfs(int now){
	for(int i=1;i<=52;i++){
		if(g[now][i]){
			g[now][i]=g[i][now]=0;
			dfs(i);
		}
	}
	ans.push_back(now);
}
int main(){
	int cnt=0,u1=1e9+7,u2=1e9+7;
	scanf("%d",&n);//输入几组个字符串 
	for(int i=1;i<=n;i++){
		scanf("%s",str);//输入字符串 固定两个字符 
		int u=getnum(str[0]),v=getnum(str[1]);//u v表示第一个字符和第二个字符相对位置 
		g[u][v]=g[v][u]=1;//u 行 v列  v行 u列 都记录 例如:输入ab 则: ab  ba都存入 
		d[u]++;//记录u出现次数 
		d[v]++;//记录v出现次数 
	}
	for(int i=1;i<=52;i++){
		if(d[i]&1){//字母出现奇数次 
			cnt++;//出现奇数次字母个数 
			u1=std::min(u1,i);//出现奇数次第一个字母 
		}else{//字母出现偶数次 
			if(d[i]!=0)u2=std::min(u2,i);//出现偶数次第一个字母 
		}
	}
	if(cnt!=0&&cnt!=2){//出现奇数次的字母个数不是0并且不是2 
		printf("No Solution\n");
		return 0;
	}
	if(!cnt)//偶数次 从第一个偶数次的字母dfs --cnt为0条件成立 只要累加过都是else 
		dfs(u2);
	else//奇数次 从第一个奇数次字母dfs 
		dfs(u1);
	reverse(ans.begin(),ans.end());//ans反转
	for(int i=0;i<ans.size();i++)printf("%c",tochar(ans[i]));//ans输出 
	return 0;
}
/*

9 ab cd hh od ob bb ba bh ha

6 ab cd hh od bh ha
*/

1 若n=1,则输出结果和输入的str相同 T
解析:n=1 只要两个字母,dfs第一次输出第一个字母,必然找到第2个字母dfs输出 例如:aa dfs(a)--dfs(a)

2 若每次输入的str均为"aa",则输出结果为n+1个'a'拼接而成的字符串 F
解析:若输入的都是aa dfs函数会把a->a对应位置改为0,只能出现一次aa

3 若n>1,且每次输入的str共2n个字符两两不同,则输出"No Solution" T
解析:两两不同,不会被去其他字母改掉,每个字母进行一次dfs 2n个字母所以输出2n字母

4 若n=26,且输入的str依次为"ab","bc","cd",...,"za",则输出结果为"abcd...za" T
解析:ab bc dfs(a)找到b,dfs(b)找到c 此时dfs(b)中的b是ab的b,bc的b就不需要所以输出abc 所以上述是正确的

5 在所有str中,出现奇数次的字母个数为()时,程序不会输出"No Solution" 2
解析:根据 cnt!=0&&cnt!=2 不满足只能是2

6 当输入为"9 ab cd hh od ob bb ba bh ha"时,输出字符串的长度为 9
解析:递归模拟

posted @ 2022-08-16 16:41  new-code  阅读(41)  评论(0)    收藏  举报