如何完成canArrangeWords()函数?
问题:给定一组单词,检查是否可以将它们排列在列表中,以使任何单词的最后一个字母与另一个单词的第一个字母相同。输入函数canArrangeWords应包含一个整数num
和一个单词数组arr
。 num
表示列表(1<=num<=100)
中的单词数。 arr
只能包含由'a' - 'z'
之间的小写字母组成的单词。如果可以按照这种方式排列单词,则返回1;如果不能,则返回-1。
Input : 4 pot ten nice eye
output : 1
input : 3 fox owl pond
output: -1
请帮助我完成此程序。 **
#include<stdio.h>
#include<string.h>
int canArrangewords(int,char [100][100]);
void main(){
int n ,count=0 , i ;
char arrayS[100][100];
scanf("%d",&n);
for (i = 0; i < n; ++i)
{
scanf("%s",arrayS[i]);
}
for(i=0;i<n;i++)
{
printf("%s",arrayS[i]);
printf("\n");
}
printf("%c\n",arrayS[2][4]);
canArrangewords(n , arrayS);
}
int canArrangewords(int n,char arrayS[100][100]){
int i , j ;
for ( i = 0; i < n; i++)
{
for ( j = i+1 ; j < strlen(arrayS[j+1]); i++)
{
int flag = strlen(arrayS[j+1]) - 1;
int temp = strcmp(arrayS[i][0],arrayS[j][flag]);
}
}
}
}
答案 0 :(得分:0)
将单词数组更改为指向单词的指针数组。然后,您可以简单地交换指针。
要加快处理速度,请使其指向结构,而不是指向单词的指针:
struct WORD {
char *firstchar; // begin of word
char *lastchar; // last char of word
} *words[100]; // array of 100 pointers to words
要阅读以下文字:
char buf[100];
for (i = 0; i < n; ++i)
{
scanf("%s",buf);
int len= strlen(buf);
words[i]= malloc(sizeof(struct WORDS));
words[i]->firstchar= malloc(len+1);
strcpy(words[i]->firstchar, buf);
words[i]->lastchar= words[i]->firstchar + len-1;
}
现在比较和排序:
if (*words[i]->lastchar == *words[j]->firstchar) {
struct WORDS *tmp= words[i+1];
words[i+1]= words[j];
words[j]= tmp;
}
循环执行此操作(一种冒泡排序)。我留给你。
答案 1 :(得分:0)
好吧,首先考虑一下您获得该答案的方式。
如果只需要知道是否可以安排它们,而不必这样做,则可以为a-z的每个字母使用一个空数组int array [26]。
规则是,所有单词的所有开头和结尾字母中,只有两个可能出现奇数次-列表中第一个单词的第一个字母和列表中最后一个单词的最后一个字母,其余必须出现偶数次。我还要添加一个检查以确保字母也为小写。祝你好运!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MINASCII 97
#define LETTERS 26
void UpdateArray(char letter, int* arr)
{
if(arr[letter - MINASCII] == 0)
{
++arr[letter - MINASCII];
}
else
{
--arr[letter - MINASCII];/*for each second time same letter is seen reduce back to zero */
}
}
int canArrangewords(int wordNum, char* wordArr[])
{
int arr[LETTERS] = {0};
int i = 0;
int count = 0 ;
char first;
char last;
char* string;
for (i= 0; i< wordNum; ++i)
{
string = wordArr[i];
first = string[0];
last = string[strlen(string)-1];
UpdateArray(first, &arr[0]);
UpdateArray(last, &arr[0]);
}
for(i = 0; i< LETTERS; ++i)
{
count+=arr[i];
}
if(count == 2 || count == 0)/*either once each or twice -see word1 example in main*/
{
return 1;
}
return -1;
}
int main()
{
int i = 0;
char* words[] = {"pot", "ten", "nice", "eye"};
char* words1[] = {"pot", "ten", "nip"};
char* words2[] = {"fox", "owl", "pond"};
i = canArrangewords(4,words);
printf("%d\n", i);
i = canArrangewords(3,words1);
printf("%d\n", i);
i = canArrangewords(3,words2);
printf("%d\n", i);
return 0;
}