Jump to content

Verificar se String existe numa String


-FN
 Share

Recommended Posts

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 ?

Link to comment
Share on other sites

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)
Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
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
 Share

×
×
  • 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.