L'idée est de garder une liste de l'ouverture des crochets, et si vous trouvez un de clôture brackt, vérifier si elle ferme le dernier ouvert:
- Si ces crochets de match, puis de supprimer le dernier ouvert à partir de la liste des openedBrackets et continuer à vérifier de manière récursive sur le reste de la chaîne
- Sinon vous avez trouvé un des supports à proximité une je n'ai jamais ouvert une seule fois, donc il n'est pas équilibrée.
Lorsque la chaîne est enfin vide, si la liste des brackes est vide aussi (donc tous les brackes a été fermé) rendement true
, le reste false
ALGORITHME (en Java):
public static boolean isBalanced(final String str1, final LinkedList<Character> openedBrackets, final Map<Character, Character> closeToOpen) {
if ((str1 == null) || str1.isEmpty()) {
return openedBrackets.isEmpty();
} else if (closeToOpen.containsValue(str1.charAt(0))) {
openedBrackets.add(str1.charAt(0));
return isBalanced(str1.substring(1), openedBrackets, closeToOpen);
} else if (closeToOpen.containsKey(str1.charAt(0))) {
if (openedBrackets.getLast() == closeToOpen.get(str1.charAt(0))) {
openedBrackets.removeLast();
return isBalanced(str1.substring(1), openedBrackets, closeToOpen);
} else {
return false;
}
} else {
return isBalanced(str1.substring(1), openedBrackets, closeToOpen);
}
}
TEST:
public static void main(final String[] args) {
final Map<Character, Character> closeToOpen = new HashMap<Character, Character>();
closeToOpen.put('}', '{');
closeToOpen.put(']', '[');
closeToOpen.put(')', '(');
closeToOpen.put('>', '<');
final String[] testSet = new String[] { "abcdefksdhgs", "[{aaa<bb>dd}]<232>", "[ff{<gg}]<ttt>", "{<}>" };
for (final String test : testSet) {
System.out.println(test + " -> " + isBalanced(test, new LinkedList<Character>(), closeToOpen));
}
}
SORTIE:
abcdefksdhgs -> true
[{aaa<bb>dd}]<232> -> true
[ff{<gg}]<ttt> -> false
{<}> -> false
Notez que j'ai importé les classes suivantes:
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;