Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

viciado

[Resolvido] String

Recommended Posts

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

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

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

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

#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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.