Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Я сделал
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
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
ca
не является подпоследовательностью abc
.
– falsetru
3 June 2014 в 15:28
all(c in it for c in x)
? Что-то говорит против этого?
– Stefan Pochmann
5 July 2016 в 10:43
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
Просто продолжайте искать следующий символ вашей потенциальной подпоследовательности, начиная с последнего найденного. Как только один из символов не может быть найден в остальной части строки, это не подпоследовательность. Если все символы могут быть найдены таким образом, это:
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
Я столкнулся с подобным вопросом интервью 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 как подпоследовательность другой строки