public static Boolean cmprStr( String s1, String s2 )
{
// STUFF
}
I want to iterate through s1 to make sure that every character in s1 is included in s2.
9 Réponses :
Pourquoi n'utilisez-vous pas simplement la méthode 'Equals'?
ou s1.compareto (S2) code> vous fournira des valeurs positives négatives, zéro et positives. zéro signifie égal. Lire J.mp/monebc
Cela ne fait pas de quoi la question demande, ce qui vérifie que chaque personnage de S1 code> est également dans S2 code>. Comme indiqué, il ne devrait pas envisager la commande ou le nombre de fois qu'un personnage apparaît et cela considère les deux.
À moins que je manque quelque chose (je dois, après que les cinq personnes ont voté pour cela), op ne veut pas vérifier si les chaînes sont égales mais si pour chaque caractère C dans S1: C est dans S2 code> . -1 jusqu'à ce que je réalise ce que j'ai manqué.
Ah! Ok désolé pour la confusion!
s1 = "aabb"; s2 = "ccddaannbbss";
Je pense que itérant une chaîne en utilisant Tokararray copiera la chaîne. Ceci est probablement moins efficace qu'une simple boucle.
Cela crée un objet supplémentaire qui n'est pas requis à cet effet.
indexOf( achar )
+1 pour fournir les pièces nécessaires au lieu de faire ses devoirs.
Set<Character> charsInS1 = new HashSet<Character>();
for (int i = 0; i < s1.length(); i++) {
charsInS1.add(s1.charAt(i));
}
for (int i = 0; i < s2.length(); i++) {
charsInS1.remove(s2.charAt(i));
}
return charsInS1.isEmpty();
This has a complexity of O(n+m)... answers using indexOf have an O(n*m) complexity. It does of course use a bit of extra memory temporarily though.
Non seulement cela utilise-t-il un peu de mémoire, mais il existe une surcharge de traitement supplémentaire considérable dans la construction du hashset code>. Je suis disposé à parier de bière aux beignets que pour des cordes très courtes, cela fonctionne pire que les solutions O (n * m) (lors de la mise en œuvre correctement). Je me demande combien de temps les chaînes doivent être pour cette approche pour briser même.
Comme je comprends la question, ce serait.
public static Boolean cmprStr( String s1, String s2 )
{
if(s1.length() == 0 )
{
return true;
}
if(!s2.contains(s1.substring(0,1)))
{
return false;
}
return cmprStr(s1.substring(1), s2);
}
public static Boolean cmprStr( String s1, String s2 )
{
for (int i = s1.length() - 1; i >= 0; --i) {
if (s2.indexOf(s1.charAt(i)) == -1) {
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
@Jim - Je n'ai pas vu une étiquette de devoirs. @sjr - Je sais. Je vois que vous avez posté une solution O (n + m). C'est mieux asymptotique, mais je me demande combien de temps les cordes doivent être avant que cela soit mieux en pratique. Il y a beaucoup de frais généraux dans la construction de hashsets comme toi.
Il n'y a pas de telle méthode getchaar mais charat
@Odelya - bonne prise; Maintenant fixé. Je suis en train de programmer dans trop de langues.
Tous les String CODE> sont également un Chaluquant (code> en Java. Par conséquent, vous pouvez facilement itération sur une chaîne code> à l'aide d'une simple boucle: int n = s.length();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
...
}
Toutes les autres réponses sont O (n ^ 2). Voici une manière linéaire dans le temps (c.-à-d. O (n)) en utilisant Google Guava :
public static boolean cmprStr(String s1, String s2) {
Set<Character> desiredCharacters = Sets.newHashSet(Lists.charactersOf(s2));
return Sets.difference(Sets.newHashSet(Lists.charactersOf(s1)), desiredCharacters).isEmpty();
}
+1 pour réduire la complexité asymptotique à O (n + m). Ce serait bien pour de très longues chaînes. Il y a moins de frais généraux en construisant un hashset, puis itérant sur les personnages de la deuxième chaîne à la recherche d'une appartenance à un ensemble. De plus, heuristiquement, il est logique de hacher la ficelle plus courte, puis d'itérair plus longtemps.
// Here's some code I wrote to find CG ratio in a gene
public double findCgRatio(String gene)
{
double cCount =0.0;
double gCount =0.0;
gene = gene.toLowerCase();
for(char character : gene.toCharArray())
{
if(character == 'c')
{
cCount++;
}
else if(character == 'g')
{
gCount++;
}
}
System.out.println("CG Ratio was :" + (cCount/gCount) );
return cCount/gCount; // cgRatio
}
S'il vous plaît ajouter des explications aussi.
cas insensible ou sensible à la casse?
Voulez-vous dire que chaque personnage apparaît dans les deux, ou qu'ils sont à la fois la même chaîne?
Chaque personnage de S1 apparaît dans S2