某机构的机构代码按照以下方式设置:
如机构A=1000000000
则其下级机构表示为10??000000,??表示两位非零数字,以此类推。
例如:如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,相反,105003010000则表示其下级的下级。现在给出两个字符串,要求验证其是否直接上下级关系。String s1 = "1008000000";
String s2 = "1008010000";
判断s2是否s1的下级要求写出最优算法

解决方案 »

  1.   

    不知道你上下级的代码长度是否一样!如果一样的话你可以试试我这方法。
    public boolean judge(String s1, String s2) {
            int point = 0;
            for (int i = 0; i < s1.length(); i++) {
                try {
                    String sub1 = s1.substring(i, i + 1);
                    String sub2 = s2.substring(i, i + 1);
                    if (!sub1.equals(sub2)) {
                        point = i + 1;
                        break;
                    }
                } catch (Exception e) {            }
            }
            String result = s2.substring(point, point + 2);
            if (!result.equals("00")) {
                return false;
            }
            return true;
        }
      

  2.   

    我写了一个算法,测试通过。package test;import junit.framework.TestCase;public class AllTest extends TestCase {
      
      private boolean isSubCode(String s1, String s2, int numSpan) {
        for (int i = 0; i < s1.length(); i++) {
          if (s1.charAt(i) == s2.charAt(i)) continue;
          
          if (s1.charAt(i) != '0') return false;
          for (int j = i + (numSpan - i % numSpan); j < s1.length(); j++) {
            if (s2.charAt(j) != '0') return false;
          }
          
          return true;
        }
        
        return true;
      }
      
      public void testDate() throws Exception {
        String s1 = "1005000000";
        String s2 = "1005110000";
        
        assertTrue(isSubCode(s1, s2, 2));
      }
    }
      

  3.   

    上面的算法需要更正:public class AllTest extends TestCase {
      
      private boolean isSubCode(String s1, String s2, int numSpan) {
        int k = 0; // 表示s1中非0值出现的个数
        for (int i = 0; i < s1.length(); i++) {
          if (i % numSpan == 0) k = 0;
          if (s1.charAt(i) != '0') k++;
          
          if (s1.charAt(i) == s2.charAt(i)) continue;
          
          if (k > 0) return false;
          for (int j = i + (numSpan - i % numSpan); j < s1.length(); j++) {
            if (s2.charAt(j) != '0') return false;
          }      return true;
        }
        
        return false;
      }
      
      public void testAll() throws Exception {
        String s1 = "10110100";
        String s2 = "10110101";

    assertTrue(isSubCode(s1, s2, 2));
    }}
      

  4.   

    若按9楼的程序, String s1 = "10110100"; 
        String s2 = "10110101111111111111"; 
    结果: s2 也是s1的直接下级对于题目还有以下疑问,"如果机构B=1050000000,则机构代码1050010000,1050990000都可以表示为其下级,"
    怎么确定   1050100000,1059900000(是) 不是他的下级?也就是怎么标志头部
      

  5.   

    解释楼上的:
    首先s1和S2的长度是相等的;
    第二,判断s1的直接下级:就是在去掉s1的所有尾部0之后,在后面添加任意两位的数字01~99,后面的剩余位再用0补齐,得到的字符串就是s1的直接下级
    s1 = "10500000000" -> "1050" -> "105001"..."105099" -> "1050010000"..."1050990000"
      

  6.   

    就是在去掉s1的所有尾部0之后,在后面添加任意两位的数字01~99s1 = "10500000000" ->  "105" ->  ...
      

  7.   

    仅供参考: public static void main(String args[]){
    String str1="1008000000";
    String str2="1008010200";

    str1=str1.replaceAll("00", "");
    str2=str2.replaceAll("00", "");

    int numSpan=2; //
    int i=(str2.length()-str1.length())/numSpan;

    System.err.println(str1);
    System.err.println(str2);
    System.err.println(i);
    }
      

  8.   

    假如直属级别,两个字符串中只有两位字符不相等,
    String s1 = "1008000000";
    String s2 = "1008010100"; 
    Pattern pa=Pattern.compile("\\d{2}");
    Matcher ma1 = pa.matcher(s1);
    Matcher ma2 = pa.matcher(s2);
    int isLevel=0;
    for(int i=0;i<s1.length()/2;i++){
    ma1.find();
    ma2.find();
    System.out.print(ma1.group()+"=");
    System.out.println(ma2.group());
    if(!(ma1.group()).equals((ma2.group()))){
    isLevel++;
    }
    }
    if(isLevel==1){
    System.out.println("inser into");
    }