viciado 1 Denunciar post Postado Dezembro 15, 2008 Como posso verificar se uma string é permutação da outra. Se todos os caracteres da primeira cadeia estão presentes na segunda. Ex "abccde" é permutação de "cbadce", mas não é de "abcdef" nem de "abcde" Como posso fazer esse programa ? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 15, 2008 para cada caracter da string1, percorra todos os caracteres da string2 e veja se str1 existe em str2. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Dezembro 15, 2008 Ta dando erro não compila #include <stdio.h> #include <stdlib.h> int main() { char palavra1[30]; char palavra2[30]; printf("Digite uma palavra\n"); gets(palavra1); printf("Digite outra palavra \n"); gets(palavra2); int i,j; int tam1 = strlen(palavra1); int tam2 = strlen(palavra2); if(tam1 > tam2){ printf("A primeira nao e permutacao da segunda \n"); } else{ for(i=0;i<tam1;i++) { if(palavra1[i] == for(j=0;j<tam2;j++){ palavra2[j]; } ) { printf("E permutacao \n"); } else{ printf("Nao e permutacao \n"); } }) } system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 15, 2008 não compila por causa disto: } ) { Você tem que fazer assim: int is_anagram = 1; for (percorre str1 com o contador i) { is_anagram = existe_caracter(str1[i], str2); if (is_anagram == 0) n~ao é permutação } A função existe_caracter tem que percorrer a string2 e procurar por str1. Se não achar, retorna 0 e encerra o loop, pois não é anagrama Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Dezembro 15, 2008 Agora imprime "Nao e permurtacao" 6 vezes #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char palavra1[30]; char palavra2[30]; printf("Digite uma palavra\n"); gets(palavra1); printf("Digite outra palavra \n"); gets(palavra2); int i,j; int tam1 = strlen(palavra1); int tam2 = strlen(palavra2); if(tam1 > tam2){ printf("A primeira nao e permutacao da segunda \n"); } else{ for(i=0;i<tam1;i++){ for(j=0;j<tam2;j++){ palavra2[j]; } if(palavra1[i] == palavra2[j]){ printf("E permutacao \n"); } else{ printf("Nao e permutacao \n"); } } } system("PAUSE"); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 15, 2008 #include <stdio.h> #include <stdlib.h> #include <string.h> int existe_char(char c, char * str) { int j, existe = 0, tam = strlen(str); for (j = 0; j < tam; j++) { if (c == str[j]) { existe = 1; break; } } return existe; } int main() { char str1[30], str2[30]; int tam1, tam2, i, e_permutacao_1 = 1, e_permutacao_2 = 1; printf("str1: "); fgets(str1, 30, stdin); printf("str2: "); fgets(str2, 30, stdin); tam1 = strlen(str1); tam2 = strlen(str2); if (tam1 != tam2) { e_permutacao_1 = 0; e_permutacao_2 = 0; } else { for (i = 0; i < tam1; i++) { e_permutacao_1 = existe_char(str1[i], str2); if ( e_permutacao_1 == 0 ) break; } for (i = 0; i < tam2; i++) { e_permutacao_2 = existe_char(str2[i], str1); if ( e_permutacao_2 == 0 ) break; } } if ( !(e_permutacao_1 == e_permutacao_2) ) { printf("Não é permutação\n"); } else { printf("é permutação\n"); } return 0; } É basicamente isso. Acho que dá para dar uma melhorada. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Dezembro 16, 2008 Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Dezembro 17, 2008 Existem alguns problemas no código do Beraldo: if ( !(e_permutacao_1 == e_permutacao_2) ) Podia ser if(e_permutacao_1 != e_permutacao_2). Vou chamar essa linha assim no resto do post pra poupar trabalho. if (tam1 != tam2) { e_permutacao_1 = 0; e_permutacao_2 = 0; } .... if(e_permutacao_1 != e_permutacao_2) { printf("Não é permutação\n"); } Se os tamanhos forem diferentes, vai dizer que é permutação. Além disso, se eu digitar abbcd e abccd vai dizer que é permutação, mesmo que um dos caracteres nas strings seja diferente, no caso o do meio. A maneira que eu acho que seria melhor para fazer seria primeiro checar o tamanho. Se o tamanho for igual, mantem uma cópia das strings para uso posterior, e então percorre a string número um, caractere por caractere. Ao procurar pelo caractere na outra string, se encontrar o caractere, removê-lo da segunda string. Seja substituindo ele por algum outro caractere que dificilmente será usado, ou modificando a string de forma a redimensioná-la para retirar o caractere. Eu acho mais simples a primeira opção. Assim, o código não irá acusar permutações onde não deveria ter. Compartilhar este post Link para o post Compartilhar em outros sites