2011-05-30 88 views
6
public static Boolean cmprStr(String s1, String s2) 
{ 
    // STUFF 
} 

我想遍歷s1以確保s1中的每個字符都包含在s2中。如何迭代Java中的字符串?

+0

不區分大小寫,或區分大小寫? – 2011-05-30 16:38:36

+2

你的意思是每個人物都出現在兩者中,或者他們都是同一個字符串? – keyboardP 2011-05-30 16:39:11

+1

s1中的每個字符出現在s2 – Shamoon 2011-05-30 16:41:54

回答

10
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; 
} 
+0

FYI這是O(n^2) – sjr 2011-05-30 17:12:54

+4

@Jim - 我沒有看到作業標籤。 @sjr - 我知道。我看到你發佈了一個O(n + m)解決方案。這樣漸近地變好了,但是我想知道在練習之前琴絃需要多長時間。像你一樣構建HashSets有很多開銷。 – 2011-05-30 17:29:48

+1

有沒有這樣的方法getChar但charAt – Dejell 2013-02-20 11:43:28

1

爲什麼不簡單使用'equals'方法?

Boolean b = s1.equals(s2); 
+0

或s1.compareTo(s2)'將爲您提供負值,零值和正值。零意味着相等。閱讀http://j.mp/mONeBc – 2011-05-30 16:45:32

+1

這不會做問題的問題,即檢查's1'中的每個字符是否也在's2'中。如上所述,它不應​​該考慮命令或角色出現的次數,並且這兩者都考慮在內。 – ColinD 2011-05-30 16:47:47

+1

除非我遺漏了一些東西(畢竟五人投票贊成這個),否則OP不想檢查字符串是否相等,但是如果's1中的每個字符c:c都在s2中'。 -1直到我意識到我錯過了什麼。 – delnan 2011-05-30 16:48:35

9
for(char c: s1.toCharArray()){ 
    if(s2.indexOf(c) == -1){ 
      return false; 
    } 
    } 
    return true; 

假設

s1 = "aabb"; 
    s2 = "ccddaannbbss"; 

將返回true。

+3

我認爲使用toCharArray迭代字符串會複製字符串。這可能比簡單的for循環效率低。 – ceving 2013-06-18 08:42:16

+0

這會創建其他目的,而不是此目的所必需的。 – VishAmdi 2017-12-05 18:25:44

8
length() 

會給你一個字符串

charAt(someIndex) 

會給你在給定位置的字符的長度,這樣你就可以遍歷的第一個字符串。

indexOf(achar) 

將爲您提供一個字符串中的字符串,如果不存在則爲-1。因此您應該能夠在第二個字符串中查找第一個字符串中的每個字符。

+1

+1提供必要的作品,而不是做他的功課。 – delnan 2011-05-30 16:50:07

2
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(); 

這具有的O(n+m)複雜?答案使用indexOfO(n*m)複雜。但它當然會暫時使用一些額外的內存。

+0

這不僅會使用一點內存,而且在構建'HashSet'時會有相當多的額外處理開銷。我願意打賭美元甜甜圈,對於非常短的字符串,這比O(n * m)解決方案(當正確實施時)更差。我想知道這種方法需要多長時間才能達到平衡。 – 2016-07-26 02:03:08

0

據我所知,這將是問題。

//for each character in s1 
    //if s2 does not contain character return false 

//return true 

for(int i = 0; i < length s1; i++){ 
    if(!s2.contains(String.valueOf(s1.charAt(i)))){ 
    return false; 
    } 
} 
return true; 

這驗證了s1中的每個字符在s2中。它沒有確認順序,也沒有確認順序,也沒有確定順序,也不是等值方法。

遞歸:

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); 
} 
0

String也是Java中的一個CharSequence。因此,您可以使用一個簡單的for循環容易遍歷一個String

int n = s.length(); 
for (int i = 0; i < n; ++i) { 
    char c = s.charAt(i); 
    ... 
} 
3

其他所有的答案都爲O(n^2)。這裏的一個方式,是使用Google Guava(即O(n))的時間線性:

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(); 
    } 
+2

+1,用於減少O(n + m)的漸近複雜度。這對於很長的字符串很有用。只需構建一個HashSet,然後迭代第二個字符串的字符尋找集合成員資格,開銷會更少。而且,啓發式地講,散列較短的字符串然後迭代較長的字符串是有意義的。 – 2011-05-30 17:34:41

0
// 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 
     } 
+0

請添加一些解釋。 – 2016-08-21 16:07:12