String 链接尾随字符的字符串排列
我正在为一些高中生写一个游戏来学习计算机科学/数学 但我也陷入了一个我为自己设计的问题,我想看看是否有更有效的方法来解决它 问题是: 给出一个单词“Abc”和一个单词列表[“猫”、“剔”、“苹果”、“橙色”…] 在这种情况下,第一个单词的最后一个字符与从单词列表中选择的任何单词的第一个字符相同,是否可以构建单词链。通过给定的单词列表可以成功地构建这个链吗?如果可能,返回true,否则返回falseString 链接尾随字符的字符串排列,string,algorithm,language-agnostic,String,Algorithm,Language Agnostic,我正在为一些高中生写一个游戏来学习计算机科学/数学 但我也陷入了一个我为自己设计的问题,我想看看是否有更有效的方法来解决它 问题是: 给出一个单词“Abc”和一个单词列表[“猫”、“剔”、“苹果”、“橙色”…] 在这种情况下,第一个单词的最后一个字符与从单词列表中选择的任何单词的第一个字符相同,是否可以构建单词链。通过给定的单词列表可以成功地构建这个链吗?如果可能,返回true,否则返回false INPUT: boolean lastCharPermutation(String startin
INPUT: boolean lastCharPermutation(String startingWord, String [] wordsList) { .. }
OUTPUT: true for able to complete the combination, false otherwise
比如说,
案例1:
拿“Abc”,“女孩”,“国王”,“猫”,“狗”,“好”,“滴答声”]
返回true,因为Abc Cat Tick King Good Dog Girl
案例2:
以《Abc》、《巡回赛》、《游戏》、《猫》、《桥牌》、《女人》、《男人》为例。
返回false,因为Abc Cat Tour并在那里停止您要做的是。。
我在上一个星期就解决了同样的问题。
这是我的密码,如果你想用。。
如果你需要解释,请告诉我,这很容易理解
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
int visit[26];
int adj[26][26];
int count=0;
void scc(int i) //Strongly COnnected Component
{
visit[i]=-1;//visiting
for(int t=0;t<26;t++)
{
if(adj[i][t]>0 && visit[t]==0)//not visited yet
scc(t);
}
visit[i]=1;
count++;
}
int main()
{
string in;
int t,n,k,nv,counta,countb,flag;
int a[26],b[26];
cin >> t;
while(t--)
{
cin >> n;
memset(a,0,26*sizeof(int));
memset(b,0,26*sizeof(int));
memset(visit,0,26*sizeof(int));
memset(adj,0,26*26*sizeof(int));
k=26;count=0;counta=0;countb=0;flag=0;nv=0;
while(n > 0)
{
n--;
cin >> in;
a[in[0]-'a']++;
b[in[in.size()-1]-'a']++;
adj[in[0]-'a'][in[in.size()-1]-'a'] = 1;
adj[in[in.size()-1]-'a'][in[0]-'a'] = 1;
}
for(int i=0;i<26;i++)
if(a[i]>0)
{
scc(i);
break;
}
for(int i=0;i<26;i++)
if(a[i]!=0 || b[i]!=0)
nv++;
if(count!=nv)
flag=1;
while(k > 0 && flag!=1 )
{
if(a[k-1]-b[k-1] == 1)
counta++;
else if(b[k-1]-a[k-1] == 1)
countb++;
else if(a[k-1]!=b[k-1])
flag = 1;
k--;
}
if(flag==0 && counta==countb && ( counta==1 || counta ==0))
cout << "Ordering is possible." <<endl;
else
cout << "The door cannot be opened." <<endl;
}
return 0;
}
#包括
#包括
#包括
使用名称空间std;
国际访问[26];
int adj[26][26];
整数计数=0;
void scc(int i)//强连通分量
{
访问[i]=-1;//访问
for(int t=0;t0&&visit[t]=0)//尚未访问
scc(t);
}
访问[i]=1;
计数++;
}
int main()
{
串入;
int t,n,k,nv,counta,countb,flag;
INTA[26],b[26];
cin>>t;
而(t--)
{
cin>>n;
memset(a,0,26*sizeof(int));
memset(b,0,26*sizeof(int));
memset(访问,0,26*sizeof(int));
memset(adj,0,26*26*sizeof(int));
k=26;计数=0;计数A=0;计数B=0;标志=0;nv=0;
而(n>0)
{
n--;
cin>>中;
a[in[0]-'a']+;
b[in[in.size()-1]-'a']++;
adj[in[0]-'a'][in[in.size()-1]-'a']=1;
adj[in[in.size()-1]-'a'][in[0]-'a']=1;
}
对于(int i=0;i0)
{
scc(i);
打破
}
对于(int i=0;i 0&&flag!=1)
{
如果(a[k-1]-b[k-1]==1)
counta++;
else如果(b[k-1]-a[k-1]==1)
countb++;
如果(a[k-1]!=b[k-1])
flag=1;
k--;
}
如果(标志==0&&counta==countb&&counta==1 | | counta==0))
问:为什么它被贴上了4种不同语言的标签?它真的意味着语言不可知吗?投票结束,我认为这不是一个真正的问题(对于这个网站).好吧,我想伪代码是可以的!或者是一种分析的方法。我想不出一种有效的方法。而且需要help@xbeta请展示一些尝试,你只是在给别人你的assignment@OP:案例2不应该是“Abc猫之旅”吗?当然。如果它符合你的需要,一定要接受它。