中级农民
- 积分
- 117
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-3-27
- 最后登录
- 1970-1-1
|
我想了个方法,同时从左右两边走,用两个set分别记录prefix set和surfix set。同时maintain一个diffset。如果prefix或surfix有一个新的element, 现查看是否diffset里是否有这个值,如果没有就把这个新elment加入,如果有就把这个值从diffset里剪掉。如果diffset为空,说明目前的prefix set 和 surfix set相同,把这时的prefix/surfix set的长度记录下来放在一个set里,叫pairSet。我还用了两个array分别记录 长度为i的prefixset出现的次数,比如{1,1,1} prefix set就是[1]那么义工出现了3次{1},{1,1},{1,1,1}
最后过一遍pairSet,然后把相应的prefix set出现的次数 * surfix set 出现的次数就可以了。
整个算法复杂度应该是O(n)- package zenefits;
- import java.util.*;
- public class PrefixSurfixArray {
- public static long getPrefixSurfixPair(int [] a){
- if(a==null||a.length==0) return 0;
- int[] leftSetCount = new int[a.length];
- int[] rightSetCount = new int[a.length];
- int left=0,right=0;
- long result=0;
- HashSet<Integer> diff = new HashSet<Integer> ();
- HashSet<Integer> leftSet = new HashSet<Integer> ();
- HashSet<Integer> rightSet = new HashSet<Integer> ();
- HashSet<Integer> pairIndex = new HashSet<Integer> ();
- while(left<a.length||right<a.length){
- int temp=0;
- if(leftSet.size()<=rightSet.size()&&left<a.length){
- temp=a[left];
- if(!leftSet.contains(temp)){
- leftSet.add(temp);
- leftSetCount[leftSet.size()-1]=1;
- if(diff.contains(temp)){
- diff.remove(temp);
- }else{
- diff.add(temp);
- }
- }else{
- leftSetCount[leftSet.size()-1]++;
- }
- left++;
- }else {
- temp=a[a.length-1-right];
- if(!rightSet.contains(temp)){
- rightSet.add(temp);
- rightSetCount[leftSet.size()-1]=1;
- if(diff.contains(temp)){
- diff.remove(temp);
- }else{
- diff.add(temp);
- }
- }else{
- rightSetCount[rightSet.size()-1]++;
- }
- right++;
- }
- if(diff.isEmpty()&&!pairIndex.contains(leftSet.size())){
- pairIndex.add(leftSet.size());
- }
- }
- for(Integer i: pairIndex){
- result+=leftSetCount[i-1]*rightSetCount[i-1];
- }
- return result;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int[][] tests={
- {1,1,1},
- {1,2, 3, 1, 2},
- {1,2,3,4,5}
- };
- for(int[] test:tests){
- System.out.println("The number of prefix-surfix pair for array " +Arrays.toString(test)+" is "+getPrefixSurfixPair(test));
- }
- }
- }
复制代码 |
|