检查Java中检查字符串是否为另一个字符串的子序列

时间:2020-01-09 10:35:23  来源:igfitidea点击:

编写一个Java程序来检查给定的String是否是另一个Java采访中经常问到的另一个字符串的子序列。

如果我们有两个字符串str1和str2,则如果在str2中找到了str1中的所有字符,则str1是str2的子序列,因此可能无法连续找到字符,但字符应该是有序的。
例如,如果str1 =" code"且str2 =" cportde",则str1是str2的子序列,因为我们可以通过删除str2中的某些字符,以相同的顺序获得str2中所有str1的字符。

如果str1 =" abc"且str2 =" bsdafgc",则str1不是str2的子序列,因为str1的所有字符都存在于str2中,但顺序不同。

Java程序检查字符串是否为另一个字符串的子序列

要检查字符串str1是否是str2的子序列,请从str1的第一个字符开始,并迭代字符串str2以检查是否找到了该字符。
如果是,则移至str1的下一个字符,并在str2中进行检查。
如果否,则在str2中检查str1的相同字符。

有递归和迭代Java程序,用于检查String是否为另一个字符串的子序列。在本文中,我们将介绍两种方式。

迭代Java程序,用于检查String是否为另一个字符串的子序列

public class SubSequenceChecker {
  public static void main(String[] args) {
    String str1 = "code";
    String str2 = "cportde";
    boolean subSeqFlag = isSubSequenceFound(str1, str2);
    displayResult(str1, str2, subSeqFlag);
    
    str1 = "abc";
    str2 = "bsdafgc";
    subSeqFlag = isSubSequenceFound(str1, str2);
    displayResult(str1, str2, subSeqFlag);
    
    str1 = "theitroad";
    str2 = "theitroadcom";
    subSeqFlag = isSubSequenceFound(str1, str2);
    displayResult(str1, str2, subSeqFlag);

  }
	
  private static boolean isSubSequenceFound(String str1, String str2){
    int j = 0;
    for(int i = 0; i < str2.length(); i++){
      // If char found move to next char
      if(str1.charAt(j) == str2.charAt(i)){
        ++j;
      }
      // Equal means all the characters of str1 are
      // found in str2 in order
      if(j == str1.length()){
        return true;
      }
    }
    return false;
  }
	
  private static void displayResult(String str1, String str2, boolean flag) {
    if(flag)
      System.out.println(str1 + " is a subsequence of " + str2);
    else
      System.out.println(str1 + " is not a subsequence of " + str2);
  }
}

输出量

code is a subsequence of cportde
abc is not a subsequence of bsdafgc
theitroad is a subsequence of 

递归Java程序,检查String是否为另一个字符串的子序列

public class SubSequenceChecker {
  public static void main(String[] args) {
    String str1 = "code";
    String str2 = "cportde";
    boolean subSeqFlag = isSubSequenceFound(str1, str2, 0, 0);
    displayResult(str1, str2, subSeqFlag);

    str1 = "abc";
    str2 = "bsdafgc";
    subSeqFlag = isSubSequenceFound(str1, str2, 0, 0);
    displayResult(str1, str2, subSeqFlag);

    str1 = "theitroad";
    str2 = "theitroadcom";
    subSeqFlag = isSubSequenceFound(str1, str2, 0, 0);
    displayResult(str1, str2, subSeqFlag);
  }
	
  /**
   * Checking if str1 is a subsequence of str2 
  */
  private static boolean isSubSequenceFound(String str1, String str2, int str1Index, int str2Index){
    // exit condition-1 
    // All the chars in str1 are found
    if(str1.length() == str1Index) {
      return true;
    }
    // exit condition-2
    // Str2 is completely iterated without finding all the
    // chars in str1
    if(str2.length() == str2Index) {
      return false;
    }
    // if char is found move both strings by one char
    // otherwise only move str2 by one char
    if(str1.charAt(str1Index) == str2.charAt(str2Index)){
      return isSubSequenceFound(str1, str2, ++str1Index, ++str2Index);
    }else{
      return isSubSequenceFound(str1, str2, str1Index, ++str2Index);
    }
  }

  private static void displayResult(String str1, String str2, boolean flag) {
    if(flag)
      System.out.println(str1 + " is a subsequence of " + str2);
    else
      System.out.println(str1 + " is not a subsequence of " + str2);
  }
}

输出量

code is a subsequence of cportde
abc is not a subsequence of bsdafgc
theitroad is a subsequence of theitroadcom