Как получить определенное слово в нерегулярной строке в python? [Дубликат]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
18
задан Colonel Panic 31 March 2015 в 14:48
поделиться

6 ответов

Я сделал

def is_subsequence(x, y):
    """Test whether x is a subsequence of y"""
    x = list(x)
    for letter in y:
        if x and x[0] == letter:
            x.pop(0)

    return not x
4
ответ дан Colonel Panic 19 August 2018 в 02:21
поделиться
def is_subseq(x, y):
    it = iter(y)
    return all(any(c == ch for c in it) for ch in x)

assert is_subseq('india', 'indonesia')
assert is_subseq('oman', 'romania')
assert is_subseq('mali', 'malawi')
assert not is_subseq('mali', 'banana')
assert not is_subseq('ais', 'indonesia')
assert not is_subseq('ca', 'abc')

Также работает для любых итераций:

assert is_subseq(['i', 'n', 'd', 'i', 'a'],
                 ['i', 'n', 'd', 'o', 'n', 'e', 's', 'i', 'a'])

UPDATE

Стефан Почманн предложил это.

def is_subseq(x, y):
    it = iter(y)
    return all(c in it for c in x)

Обе версии использует итераторы; Итератор дает элементы, которые не были получены на предыдущей итерации.

Например:

>>> it = iter([1,2,3,4])
>>> for x in it:
...     print(x)
...     break
...
1
>>> for x in it:  # `1` is yielded in previous iteration. It's not yielded here.
...     print(x)
...
2
3
4
30
ответ дан falsetru 19 August 2018 в 02:21
поделиться
  • 1
    Как насчет 'ca' в 'abc'? – user189 3 June 2014 в 15:27
  • 2
    @ user189. Согласно цитате в вопросе, порядок важен; ca не является подпоследовательностью abc. – falsetru 3 June 2014 в 15:28
  • 3
    Хорошо, неправильно понял использование итератора здесь, кажется довольно умным. – user189 3 June 2014 в 15:30
  • 4
    Что вы думаете о all(c in it for c in x)? Что-то говорит против этого? – Stefan Pochmann 5 July 2016 в 10:43
  • 5
    @ user2361174, it в ответе - итератор. Повторяемый элемент снова не повторяется. (Потребляется) – falsetru 11 February 2017 в 08:44
def subsequence(seq, subseq):
    seq = seq.lower()
    subseq = subseq.lower()
    for char in subseq:
        try:      
            seq = seq[seq.index(char)+1:]            
        except:
            return False
    return True
0
ответ дан jgrgurica 19 August 2018 в 02:21
поделиться

Просто продолжайте искать следующий символ вашей потенциальной подпоследовательности, начиная с последнего найденного. Как только один из символов не может быть найден в остальной части строки, это не подпоследовательность. Если все символы могут быть найдены таким образом, это:

def is_subsequence(needle, haystack):
    current_pos = 0
    for c in needle:
        current_pos = haystack.find(c, current_pos) + 1
        if current_pos == 0 : return False
    return True
2
ответ дан KillianDS 19 August 2018 в 02:21
поделиться

Я столкнулся с подобным вопросом интервью GOOGLE здесь

@Colonel Panic

Вам даже не нужно преобразовывать две строки в списки для push pop-операций

Просто мы можем использовать два метода указателя для этого в O (n) O (1)

Допустим, что мы имеем

Ирландия и Иран

начинаются с двух указателей i и j, указывающих на два первых начала строк

bool Is_subsequence_of(string &A,string &B)
{
  // Is B a subsequence of A //
  int i = 0,j = 0;
  while((i < A.length())&&(j < B.length()))
  {
    if(A[i] == B[j]){i++;j++;}
    else i++;
  } 
  if(j == B.length())return true;
  else return false;
}

. Другой подход может быть связан здесь

Таким образом, здесь вы также можете найти количество экземпляров, которые строка ccurs как подпоследовательность другой строки

0
ответ дан Vinayak Sangar 19 August 2018 в 02:21
поделиться
-1
ответ дан AlanH 30 October 2018 в 13:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: