Jump to content
-FN

Verificar se String existe numa String

Recommended Posts

-FN

Ando aqui às voltas a ver se consigo fazer uma função que verifique se a String "ola" está na String "eu digo ola a todos" e não consigo.

Não existe uma função pré-definida para isto ?

Se não houver, podem ajudar-me ?

Share this post


Link to post
Share on other sites
jpedro20

Ando aqui às voltas a ver se consigo fazer uma função que verifique se a String "ola" está na String "eu digo ola a todos" e não consigo.

Nas strings as palavras que queres verificar estão separadas por espaços ou pode acontecer: "eudigoolaatodos"?

Share this post


Link to post
Share on other sites
-FN

Já consegui fazer uma função própria.

Já agora, podes dizer como resolvias o problema com essas funções ?

Share this post


Link to post
Share on other sites
jpedro20

Já consegui fazer uma função própria.

Já agora, podes dizer como resolvias o problema com essas funções ?

Coloca aí como resolves-te que eu posto logo a seguir

Share this post


Link to post
Share on other sites
-FN
existString :: String -> String -> Int -> Bool
existString _ "" _ = False
existString (s:ss) (t:tt) n | n < comprimento && s /= t = existString (s:ss) tt 0
		    | n < comprimento && s == t = True && existString ss tt (n+1)
		    | n == comprimento && s == t = True
		    | otherwise = False
			where comprimento = length (s:ss)

Share this post


Link to post
Share on other sites
jpedro20
existString :: String -> String -> Bool
existString pal frase = elem pal $ words frase

Share this post


Link to post
Share on other sites
-FN

A tua funciona nestes casos:

"ola"  "ola a todos"

Mas não funciona nestes

"ola a" "ola a todos"

No entanto, eu também não frisei bem o que pretendia, em termos de procura. Mas obrigado pela ajuda ;)

Share this post


Link to post
Share on other sites
jpedro20

Para a próxima tens de especificar melhor o problema ;)

existString :: String -> String -> Int -> Bool
existString _ "" _ = False
existString (s:ss) (t:tt) n | n < comprimento && s /= t = existString (s:ss) tt 0
		    | n < comprimento && s == t = True && existString ss tt (n+1)
		    | n == comprimento && s == t = True
		    | otherwise = False
			where comprimento = length (s:ss)

*Teste> existString "ola" "ola a todos" 0

False

Sempre que encontras uma letra da palavra igual à tua string estas a aumentar o n, mas com a recursividade estás a diminuir o comprimento da palavra (o comprimento deve ser sempre igual)

Share this post


Link to post
Share on other sites
-FN

Bem visto. Não tinha reparado nisso  :wallbash:

Já vou ter de rever esta coisa :facepalm:

Share this post


Link to post
Share on other sites
jpedro20

Penso que seja isto

existString :: String -> String -> Bool
existString pal frase = aux pal frase tam 1
	where tam = length pal

aux :: String -> String -> Int -> Int -> Bool
aux _ "" _ _ = False
aux "" _ _ _ = False
aux pal (t:tt) tam n | (n < tam || n== tam) && header /= t = aux pal tt tam 1
                     | n < tam && header == t = aux pal tt tam (n+1)
                     | header == t = True
                     | otherwise = False
           where header = head $ drop (n-1) pal

Também funciona nestes casos

*Teste> existString "ola" "olaatodos"

True

Share this post


Link to post
Share on other sites
-FN

Eu já fiz uma auxiliar e ficou parecida com essa. Nessa função, fazes cerca de 4 travessias na lista, ou seja, a eficiência é reduzida.

Nesta fazes duas:

--Verifica se String existe numa string
existStringAUX :: String -> Int -> String -> Int -> Bool
existStringAUX _ _ "" _ = False
existStringAUX (s:ss) c (t:tt) n | n < c && s /= t = existStringAUX (s:ss) c tt 1
		    	 | n < c && s == t = True && existStringAUX ss c tt (n+1)
		   	 | n == c && s == t = True
		   	 | otherwise = False

existString :: String -> String -> Bool
existString _ "" = False
existString exc frase = existStringAUX exc (length exc) frase 1

Share this post


Link to post
Share on other sites
jpedro20

Eu fiz como tu em primeiro mas nao funciona:

*Teste> existString "ola a" "ol ola a todos"

*** Exception: teste.hs:(4,0)-(8,51): Non-exhaustive patterns in function existStringAUX

*Teste> existString "bom" "bo ola bom"

False

quando ele encontra uma letra igual estás a descartar essa letra. Caso depois nao seja a palavra correcta, ele não contém a palavra inicial

Share this post


Link to post
Share on other sites
-FN

Credo. Se fosse testar todas as tentativas possíveis, isto matava-me  :dontgetit:

Vou usar a que fizeste ;)

Share this post


Link to post
Share on other sites
jpedro20

LOL mas tens de ver todas as possibilidades

existString :: String -> String -> Bool
existString _ "" = False
existString "" _ = False
existString pal (t:tt) | verifica pal (t:tt) == True = True
                       | otherwise = existString pal tt

verifica :: String -> String -> Bool
verifica "" _ = True
verifica _ "" = False
verifica (s:ss) (t:tt) | s==t = verifica ss tt
                       | otherwise = False

outra solução

Share this post


Link to post
Share on other sites
Betovsky

Já existe uma função que faça isso: isInfixOf

Por código poderia ser algo do género

existString :: String -> String -> Bool
existString s = any (and . zipWith (==) s) . init . tails


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
jpedro20

existString :: String -> String -> Bool
existString s = any (and . zipWith (==) s) . init . tails

Isto é O(N) não é?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.